diff --git a/ChangeLog b/ChangeLog
index 2a576843dc715c71d85e08614b65bdbb9b5b4c7f..97e4a68b54522673ca9834ea8feb7c85c8090db4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,14 +1,53 @@
 NEXT VERSION
 
-V4.20.1.2.0 - 2019-01-15
--
+V4.21.6 - 2019-10-14
+- VRX (CURTSYS-2484) Implement status JSON update for line stats
+- VRX (CURTSYS-2485) Implement status JSON update for channel stats
+  (dsl.stats.line.channel) parameters
+- VRX (CURTSYS-2483) Implement status JSON update for channel
+  (dsl.status.line.channel) parameters
+- VRX (CURTSYS-2482) [Status] Status JSON update for line parameters (prio 7)
+- VRX (CURTSYS-2481) [Status] Create infrastructure to handle dsl status JSON file
+
+V4.21.5 - 2019-10-08
+- VRX (CURTSYS-2646) Refactoring configuration interface between dsl_cpe_control
+  and DSL API Driver
+
+V4.21.4 - 2019-09-30
+common:
+- VRX (CURTSYS-1854) DSL bootup without script handling, 1, Move Signals
+- VRX (CURTSYS-2412) SDL compliant replacement for selection of DSL operator mode
+- VRX (CURTSYS-2310) Extend procd startup handling with priority 5 config parameters
+- VRX (CURTSYS-2309) Extend procd startup handling with priority 4 config parameters
+- VRX (CURTSYS-2307) Extend procd startup handling with priority 2 config parameters
+- VRX (CURTSYS-2394) DCT and DSPSPY cannot read data
+  via Winhost interface in UGW8.3.2
+- VRX (CURTSYS-2302) Extend proc startup handling with usage of cmd line args
+- VRX (CURTSYS-1852) [VRX] Cleanup of DTI dependencies
+- VRX (CURTSYS-1851) SDL: status parser linkencaps handling added
+- VRX (CURTSYS-1254) SDL: status parser datarates handling update
+- VRX (CURTSYS-1562) SDL: XTSE config param unified with uci
+
+V4.21.3 - 2019-05-20
+- VRX (CURTSYS-499) SDL: configuration handling update (XTSE), status handling added
+- VRX (CURTSYS-491) IOctl and FIFO peek errors during congested DTI traffic
+- VRX (DSLCPE_SW-1182) Optimization and cleanup of handling within Ctrl/API
+- VRX (DSLCPE_SW-1180) Functionality of VRX518 shall be given also without using
+  safe-c library (V3)
+
+V4.21.2 - 2019-02-14
+common:
+- VRX (GFASTSW-698) SDL: allow only one DSL-control instance
+- VRX (DSLCPE_SW-1177) Adding missing parameters for Robust Overhead Channel (ROC)
+- VRX (GFASTSW-709) SDL: update to new safe-c library version in UGW
 
-V4.20.1.2 - 2018-08-16
--
+V4.21.1 - 2018-10-29
+- VRX (DSLCPE_SW-1164) The configuration file for the DSL Subsystem
+  (dsl_web.cfg) is not written correctly
 
-V4.20.1.1 - 2018-08-02
-common:
-- (DSLCPE_SW-1151) Using some CLI commands results in CLI interface stuck
+V4.21.0 - 2018-08-17
+-.(DSLCPE_SW-1151) Using some CLI commands results in CLI interface stuck
+- VRX (DSLCPE_SW-1153) Cleanup of banned functions
 
 V4.20.1 - 2018-06-28
 common:
diff --git a/Makefile.in b/Makefile.in
index 21e35736f853e312af644ef6dad89df439641bb3..58a9331b89f679ac9c395440579416f876bacc33 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -310,6 +310,7 @@ INCLUDE_DSL_G997_FRAMING_PARAMETERS = @INCLUDE_DSL_G997_FRAMING_PARAMETERS@
 INCLUDE_DSL_G997_LINE_INVENTORY = @INCLUDE_DSL_G997_LINE_INVENTORY@
 INCLUDE_DSL_G997_PER_TONE = @INCLUDE_DSL_G997_PER_TONE@
 INCLUDE_DSL_G997_STATUS = @INCLUDE_DSL_G997_STATUS@
+INCLUDE_DSL_JSON_PARSING = @INCLUDE_DSL_JSON_PARSING@
 INCLUDE_DSL_PM = @INCLUDE_DSL_PM@
 INCLUDE_DSL_RESOURCE_STATISTICS = @INCLUDE_DSL_RESOURCE_STATISTICS@
 INCLUDE_DSL_SYSTEM_INTERFACE = @INCLUDE_DSL_SYSTEM_INTERFACE@
@@ -324,6 +325,8 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 LDFLAGS = @LDFLAGS@
+LIBJSON_C_INCL_PATH = @LIBJSON_C_INCL_PATH@
+LIBJSON_C_LIBRARY_PATH = @LIBJSON_C_LIBRARY_PATH@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LTLIBOBJS = @LTLIBOBJS@
@@ -338,6 +341,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+SAFEC_INCL_PATH = @SAFEC_INCL_PATH@
+SAFEC_LIB_NAME = @SAFEC_LIB_NAME@
+SAFEC_LIB_PATH = @SAFEC_LIB_PATH@
+SAFEC_SUPPORT = @SAFEC_SUPPORT@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -633,7 +640,7 @@ distdir: $(DISTFILES)
 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
 	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
 	$(am__post_remove_distdir)
 
 dist-bzip2: distdir
@@ -659,7 +666,7 @@ dist-shar: distdir
 	@echo WARNING: "Support for shar distribution archives is" \
 	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -677,7 +684,7 @@ dist dist-all:
 distcheck: dist
 	case '$(DIST_ARCHIVES)' in \
 	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
 	*.tar.lz*) \
@@ -687,7 +694,7 @@ distcheck: dist
 	*.tar.Z*) \
 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
 	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
 	esac
diff --git a/aclocal.m4 b/aclocal.m4
index d99276a76ea080c2115d9c04742fb792e051911e..c00278288af7c5070c1eef6c874d3128ef50a285 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15 -*- Autoconf -*-
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.15], [],
+m4_if([$1], [1.15.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15])dnl
+[AM_AUTOMAKE_VERSION([1.15.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -332,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -408,7 +408,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -605,7 +605,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -626,7 +626,7 @@ if test x"${install_sh+set}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2014 Free Software Foundation, Inc.
+# Copyright (C) 2003-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -647,7 +647,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -697,7 +697,7 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -736,7 +736,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -765,7 +765,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -812,7 +812,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -831,7 +831,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -912,7 +912,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+# Copyright (C) 2009-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -973,7 +973,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1001,7 +1001,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+# Copyright (C) 2006-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1020,7 +1020,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+# Copyright (C) 2004-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/build_win32/dsl_cpe_control_version.h b/build_win32/dsl_cpe_control_version.h
index 3a69e2f00e8b932667058103e5e2158e0c7cc732..cdb4b1266cc484f5eb8cdf5651f3ddd842899c5f 100644
--- a/build_win32/dsl_cpe_control_version.h
+++ b/build_win32/dsl_cpe_control_version.h
@@ -5,7 +5,7 @@
 #define PACKAGE "dsl_cpe_control"
 
 /* Version number of package */
-#define VERSION "4.20.1.2.0"
+#define VERSION "4.21.6"
 
 /* Define to the version of this package. */
 #define PACKAGE_VERSION VERSION
diff --git a/compile b/compile
index a85b723c7e67d46316e85e7422bd5088e9136042..2ab71e4ea13e0e902ec8a5357546f0a10d3f67ea 100755
--- a/compile
+++ b/compile
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Wrapper for compilers which do not understand '-c -o'.
 
-scriptversion=2012-10-14.11; # UTC
+scriptversion=2016-01-11.22; # UTC
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -255,7 +255,8 @@ EOF
     echo "compile $scriptversion"
     exit $?
     ;;
-  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
     func_cl_wrapper "$@"      # Doesn't return...
     ;;
 esac
@@ -342,6 +343,6 @@ exit $ret
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
 # time-stamp-end: "; # UTC"
 # End:
diff --git a/configure b/configure
index 35bafc66910f0553e2bec4fa2942f3e4c0e58181..8ed9699a00dca3402c4e6472b85bd872ecf0ba6c 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
 #! /bin/sh
 # From configure.in Revision: 1.173 .
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for DSL CPE Control application 4.20.1.2.0.
+# Generated by GNU Autoconf 2.69 for DSL CPE Control application 4.21.6.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -578,8 +578,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='DSL CPE Control application'
 PACKAGE_TARNAME='dsl_cpe_control'
-PACKAGE_VERSION='4.20.1.2.0'
-PACKAGE_STRING='DSL CPE Control application 4.20.1.2.0'
+PACKAGE_VERSION='4.21.6'
+PACKAGE_STRING='DSL CPE Control application 4.21.6'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -625,6 +625,12 @@ am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
 DISTCHECK_CONFIGURE_PARAMS
+SAFEC_LIB_PATH
+SAFEC_INCL_PATH
+SAFEC_LIB_NAME
+SAFEC_SUPPORT
+SAFEC_SUPPORT_FALSE
+SAFEC_SUPPORT_TRUE
 INCLUDE_DTI_AGENT_STANDALONE_SUPPORT
 INCLUDE_DTI_AGENT_STANDALONE_SUPPORT_FALSE
 INCLUDE_DTI_AGENT_STANDALONE_SUPPORT_TRUE
@@ -771,6 +777,9 @@ INCLUDE_DEPRECATED_TRUE
 INCLUDE_FW_REQUEST_SUPPORT
 INCLUDE_FW_REQUEST_SUPPORT_FALSE
 INCLUDE_FW_REQUEST_SUPPORT_TRUE
+INCLUDE_DSL_JSON_PARSING
+INCLUDE_DSL_JSON_PARSING_FALSE
+INCLUDE_DSL_JSON_PARSING_TRUE
 INCLUDE_DSL_CPE_DEBUG_LOGGER_SUPPORT
 DSL_CCA_DBG_MAX_LEVEL_PRE
 DSL_CCA_DBG_MAX_LEVEL_SET
@@ -778,6 +787,8 @@ DSL_CPE_DEBUG_DISABLE
 DSL_CCA_DBG_MAX_LEVEL_SET_FALSE
 DSL_CCA_DBG_MAX_LEVEL_SET_TRUE
 IFXOS_INCLUDE_PATH
+LIBJSON_C_LIBRARY_PATH
+LIBJSON_C_INCL_PATH
 IFXOS_LIBRARY_PATH
 INCLUDE_DSL_CPE_IFXOS_SUPPORT
 INCLUDE_DSL_CPE_IFXOS_SUPPORT_FALSE
@@ -909,8 +920,11 @@ enable_driver_include
 enable_device_driver_include
 enable_ifxos
 enable_ifxos_library
+enable_libjson_c_include
+enable_libjson_c_library
 enable_ifxos_include
 enable_debug_prints
+enable_libjson_c_support
 enable_dsl_fw_request
 enable_deprecated
 enable_device_exception_codes
@@ -962,6 +976,9 @@ enable_real_time_trace
 enable_debug_logger_support
 with_dbg_netlink_id
 enable_dti_agent_st_alone_support
+enable_safec_support
+enable_safec_include
+enable_safec_library
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1512,7 +1529,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures DSL CPE Control application 4.20.1.2.0 to adapt to many kinds of systems.
+\`configure' configures DSL CPE Control application 4.21.6 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1578,7 +1595,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of DSL CPE Control application 4.20.1.2.0:";;
+     short | recursive ) echo "Configuration of DSL CPE Control application 4.21.6:";;
    esac
   cat <<\_ACEOF
 
@@ -1616,11 +1633,17 @@ Optional Features:
   --enable-ifxos-library=-L/path/to/your/lib_ifxos/src
                           Set the lib_ifxos library path. In this location the
                           libifxos.a should be found
+  --enable-libjson-c-include= -I/path/to/your/libjson-c/include
+                          Set the JSON C include path
+  --enable-libjson-c-library= -L/path/to/your/libjson-c/library
+                          Set the JSON C library path
   --enable-ifxos-include=-I/path/to/your/lib_ifxos/src/include
                           Set the lib_ifxos include path.
   --enable-debug-prints=level
                           Enable debug printouts (default:
                           yes/err|none/no|prn|err|wrn|msg|local)
+  --enable-libjson-c-support=x
+                          Enable JSON parsing support.
   --enable-dsl-fw-request Include FW request support
   --enable-deprecated     Include deprecated functions
   --enable-device-exception-codes
@@ -1707,6 +1730,12 @@ Optional Features:
                           Enable debug logger support
   --enable-dti-agent-st-alone-support=x
                           Enable debug logger support
+  --enable-safec-support=x
+                          Enable SAFE C support
+  --enable-safec-include= -I./STAGING_DIR/usr/include
+                          Set the SAFE C include path
+  --enable-safec-library= -L./STAGING_DIR/usr/lib
+                          Set the SAFE C library path
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1790,7 +1819,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-DSL CPE Control application configure 4.20.1.2.0
+DSL CPE Control application configure 4.21.6
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2092,11 +2121,57 @@ $as_echo "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_type
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by DSL CPE Control application $as_me 4.20.1.2.0, which was
+It was created by DSL CPE Control application $as_me 4.21.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2961,7 +3036,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='dsl_cpe_control'
- VERSION='4.20.1.2.0'
+ VERSION='4.21.6'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5499,6 +5574,54 @@ else
 
 
 
+fi
+
+
+DEFAULT_LIBJSON_C_INCL_PATH=''
+# Check whether --enable-libjson-c-include was given.
+if test "${enable_libjson_c_include+set}" = set; then :
+  enableval=$enable_libjson_c_include;
+        if test -n "$enableval"; then
+            echo Set the JSON C include path to $enableval
+            LIBJSON_C_INCL_PATH=$enableval
+
+        else
+            echo Set the JSON C include path to $DEFAULT_LIBJSON_C_INCL_PATH
+            LIBJSON_C_INCL_PATH=$DEFAULT_LIBJSON_C_INCL_PATH
+
+        fi
+
+else
+
+        echo Set the JSON C include path to $DEFAULT_LIBJSON_C_INCL_PATH
+        LIBJSON_C_INCL_PATH=$DEFAULT_LIBJSON_C_INCL_PATH
+
+
+
+fi
+
+
+DEFAULT_LIBJSON_C_LIBRARY_PATH=''
+# Check whether --enable-libjson-c-library was given.
+if test "${enable_libjson_c_library+set}" = set; then :
+  enableval=$enable_libjson_c_library;
+        if test -n "$enableval"; then
+            echo Set the JSON C library path to $enableval
+            LIBJSON_C_LIBRARY_PATH=$enableval
+
+        else
+            echo Set the JSON C library path to $DEFAULT_LIBJSON_C_LIBRARY_PATH
+            LIBJSON_C_LIBRARY_PATH=$DEFAULT_LIBJSON_C_LIBRARY_PATH
+
+        fi
+
+else
+
+        echo Set the JSON C library path to $DEFAULT_LIBJSON_C_LIBRARY_PATH
+        LIBJSON_C_LIBRARY_PATH=$DEFAULT_LIBJSON_C_LIBRARY_PATH
+
+
+
 fi
 
 
@@ -5977,6 +6100,53 @@ fi
         esac
 
 
+fi
+
+
+ if false; then
+  INCLUDE_DSL_JSON_PARSING_TRUE=
+  INCLUDE_DSL_JSON_PARSING_FALSE='#'
+else
+  INCLUDE_DSL_JSON_PARSING_TRUE='#'
+  INCLUDE_DSL_JSON_PARSING_FALSE=
+fi
+
+INCLUDE_DSL_JSON_PARSING=no
+
+# Check whether --enable-libjson-c-support was given.
+if test "${enable_libjson_c_support+set}" = set; then :
+  enableval=$enable_libjson_c_support;
+        if test "$enableval" = yes; then
+            for ac_header in json-c/json.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "json-c/json.h" "ac_cv_header_json_c_json_h" "$ac_includes_default"
+if test "x$ac_cv_header_json_c_json_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_JSON_C_JSON_H 1
+_ACEOF
+ libjson_c_path=yes; break;
+fi
+
+done
+
+
+            if test "x$libjson_c_path" = "xyes"; then
+
+$as_echo "#define INCLUDE_DSL_JSON_PARSING 1" >>confdefs.h
+
+                 if true; then
+  INCLUDE_DSL_JSON_PARSING_TRUE=
+  INCLUDE_DSL_JSON_PARSING_FALSE='#'
+else
+  INCLUDE_DSL_JSON_PARSING_TRUE='#'
+  INCLUDE_DSL_JSON_PARSING_FALSE=
+fi
+
+                INCLUDE_DSL_JSON_PARSING=yes
+
+            fi
+        fi
+
 fi
 
 
@@ -8954,6 +9124,145 @@ fi
 fi
 
 
+ if false; then
+  SAFEC_SUPPORT_TRUE=
+  SAFEC_SUPPORT_FALSE='#'
+else
+  SAFEC_SUPPORT_TRUE='#'
+  SAFEC_SUPPORT_FALSE=
+fi
+
+SAFEC_SUPPORT=no
+
+# Check whether --enable-safec-support was given.
+if test "${enable_safec_support+set}" = set; then :
+  enableval=$enable_safec_support;
+        if test "$enableval" = yes; then
+            for ac_header in safe_lib.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "safe_lib.h" "ac_cv_header_safe_lib_h" "$ac_includes_default"
+if test "x$ac_cv_header_safe_lib_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SAFE_LIB_H 1
+_ACEOF
+ safec_header_support=yes; break;
+fi
+
+done
+
+
+            if test "x$safec_header_support" = "xyes"; then
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _strcat_s_chk in -lsafec-3.3" >&5
+$as_echo_n "checking for _strcat_s_chk in -lsafec-3.3... " >&6; }
+if ${ac_cv_lib_safec_3_3__strcat_s_chk+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsafec-3.3  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char _strcat_s_chk ();
+int
+main ()
+{
+return _strcat_s_chk ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_safec_3_3__strcat_s_chk=yes
+else
+  ac_cv_lib_safec_3_3__strcat_s_chk=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_safec_3_3__strcat_s_chk" >&5
+$as_echo "$ac_cv_lib_safec_3_3__strcat_s_chk" >&6; }
+if test "x$ac_cv_lib_safec_3_3__strcat_s_chk" = xyes; then :
+  safec_lib_ver=3; break;
+fi
+
+
+                if test "x$safec_lib_ver" = "x3"; then
+
+$as_echo "#define SAFEC_SUPPORT 3" >>confdefs.h
+
+                     if true; then
+  SAFEC_SUPPORT_TRUE=
+  SAFEC_SUPPORT_FALSE='#'
+else
+  SAFEC_SUPPORT_TRUE='#'
+  SAFEC_SUPPORT_FALSE=
+fi
+
+                    SAFEC_SUPPORT=yes
+
+                    SAFEC_LIB_NAME=safec-3.3
+
+                fi
+            fi
+        fi
+
+fi
+
+
+DEFAULT_SAFEC_INCL_PATH=''
+# Check whether --enable-safec-include was given.
+if test "${enable_safec_include+set}" = set; then :
+  enableval=$enable_safec_include;
+        if test -n "$enableval"; then
+            echo Set the SAFE C include path to $enableval
+            SAFEC_INCL_PATH=$enableval
+
+
+        else
+            SAFEC_INCL_PATH=$DEFAULT_SAFEC_INCL_PATH
+
+        fi
+
+else
+
+        SAFEC_INCL_PATH=$DEFAULT_SAFEC_INCL_PATH
+
+
+
+fi
+
+
+DEFAULT_SAFEC_LIB_PATH=''
+# Check whether --enable-safec-library was given.
+if test "${enable_safec_library+set}" = set; then :
+  enableval=$enable_safec_library;
+        if test -n "$enableval"; then
+            echo Set the SAFE C library path to $enableval
+            SAFEC_LIB_PATH=$enableval
+
+
+        else
+            SAFEC_LIB_PATH=$DEFAULT_SAFEC_LIB_PATH
+
+        fi
+
+else
+
+        SAFEC_LIB_PATH=$DEFAULT_SAFEC_LIB_PATH
+
+
+
+fi
+
+
+
 
 DISTCHECK_CONFIGURE_PARAMS=$CONFIGURE_OPTIONS
 
@@ -9235,6 +9544,14 @@ if test -z "${DSL_CCA_DBG_MAX_LEVEL_SET_TRUE}" && test -z "${DSL_CCA_DBG_MAX_LEV
   as_fn_error $? "conditional \"DSL_CCA_DBG_MAX_LEVEL_SET\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${INCLUDE_DSL_JSON_PARSING_TRUE}" && test -z "${INCLUDE_DSL_JSON_PARSING_FALSE}"; then
+  as_fn_error $? "conditional \"INCLUDE_DSL_JSON_PARSING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${INCLUDE_DSL_JSON_PARSING_TRUE}" && test -z "${INCLUDE_DSL_JSON_PARSING_FALSE}"; then
+  as_fn_error $? "conditional \"INCLUDE_DSL_JSON_PARSING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${INCLUDE_FW_REQUEST_SUPPORT_TRUE}" && test -z "${INCLUDE_FW_REQUEST_SUPPORT_FALSE}"; then
   as_fn_error $? "conditional \"INCLUDE_FW_REQUEST_SUPPORT\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -9943,6 +10260,14 @@ if test -z "${INCLUDE_DTI_AGENT_STANDALONE_SUPPORT_TRUE}" && test -z "${INCLUDE_
   as_fn_error $? "conditional \"INCLUDE_DTI_AGENT_STANDALONE_SUPPORT\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${SAFEC_SUPPORT_TRUE}" && test -z "${SAFEC_SUPPORT_FALSE}"; then
+  as_fn_error $? "conditional \"SAFEC_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SAFEC_SUPPORT_TRUE}" && test -z "${SAFEC_SUPPORT_FALSE}"; then
+  as_fn_error $? "conditional \"SAFEC_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 echo -e "------------------------------------------------------------------------"
 echo -e " Configuration for dsl_cpe_control:"
@@ -10018,6 +10343,13 @@ echo -e "  Include real time trace support:  $INCLUDE_REAL_TIME_TRACE"
 echo -e "  Include debug logger support:     $INCLUDE_DSL_CPE_DEBUG_LOGGER_SUPPORT"
 echo -e "  Netlink ID of the debug messages: $DSL_DBG_MSG_NETLINK_ID"
 echo -e "  Include DTI agent stand-alone:    $INCLUDE_DTI_AGENT_STANDALONE_SUPPORT"
+echo -e "  Safe-C support:                   $SAFEC_SUPPORT"
+echo -e "  Safe-C include path:              $SAFEC_INCL_PATH"
+echo -e "  Safe-C library path:              $SAFEC_LIB_PATH"
+echo -e "  Safe-C library:                   $SAFEC_LIB_NAME"
+echo -e "  Include JSON parser:              $INCLUDE_DSL_JSON_PARSING"
+echo -e "  JSON C include path:              $LIBJSON_C_INCL_PATH"
+echo -e "  JSON C library path:              $LIBJSON_C_LIBRARY_PATH"
 echo -e "----------------------- deprectated ! ----------------------------------"
 echo -e "  currently no such functions"
 echo -e "------------------------------------------------------------------------"
@@ -10422,7 +10754,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by DSL CPE Control application $as_me 4.20.1.2.0, which was
+This file was extended by DSL CPE Control application $as_me 4.21.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -10488,7 +10820,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-DSL CPE Control application config.status 4.20.1.2.0
+DSL CPE Control application config.status 4.21.6
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.in b/configure.in
index 96b5b6ac90ccc61b51f833c8623e781e61a56dfa..824d6b62c57364dbab2d8b825be09237e973f603 100644
--- a/configure.in
+++ b/configure.in
@@ -1,6 +1,6 @@
 AC_REVISION($Revision: 1.173 $)
 
-AC_INIT([DSL CPE Control application],[4.20.1.2.0],[],[dsl_cpe_control])
+AC_INIT([DSL CPE Control application],[4.21.6],[],[dsl_cpe_control])
 AC_CONFIG_SRCDIR(src/Makefile.am)
 AM_INIT_AUTOMAKE([tar-pax])
 
@@ -468,6 +468,44 @@ AC_ARG_ENABLE(ifxos-library,
     ]
 )
 
+dnl set system JSON C include path
+DEFAULT_LIBJSON_C_INCL_PATH=''
+AC_ARG_ENABLE(libjson-c-include,
+    AS_HELP_STRING([--enable-libjson-c-include= -I/path/to/your/libjson-c/include],[Set the JSON C include path]),
+    [
+        if test -n "$enableval"; then
+            echo Set the JSON C include path to $enableval
+            AC_SUBST([LIBJSON_C_INCL_PATH],[$enableval])
+        else
+            echo Set the JSON C include path to $DEFAULT_LIBJSON_C_INCL_PATH
+            AC_SUBST([LIBJSON_C_INCL_PATH],[$DEFAULT_LIBJSON_C_INCL_PATH])
+        fi
+    ],
+    [
+        echo Set the JSON C include path to $DEFAULT_LIBJSON_C_INCL_PATH
+        AC_SUBST([LIBJSON_C_INCL_PATH],[$DEFAULT_LIBJSON_C_INCL_PATH])
+    ]
+)
+
+dnl set system JSON C library path
+DEFAULT_LIBJSON_C_LIBRARY_PATH=''
+AC_ARG_ENABLE(libjson-c-library,
+    AS_HELP_STRING([--enable-libjson-c-library= -L/path/to/your/libjson-c/library],[Set the JSON C library path]),
+    [
+        if test -n "$enableval"; then
+            echo Set the JSON C library path to $enableval
+            AC_SUBST([LIBJSON_C_LIBRARY_PATH],[$enableval])
+        else
+            echo Set the JSON C library path to $DEFAULT_LIBJSON_C_LIBRARY_PATH
+            AC_SUBST([LIBJSON_C_LIBRARY_PATH],[$DEFAULT_LIBJSON_C_LIBRARY_PATH])
+        fi
+    ],
+    [
+        echo Set the JSON C library path to $DEFAULT_LIBJSON_C_LIBRARY_PATH
+        AC_SUBST([LIBJSON_C_LIBRARY_PATH],[$DEFAULT_LIBJSON_C_LIBRARY_PATH])
+    ]
+)
+
 dnl set lib_ifxos include path
 DEFAULT_IFXOS_INCLUDE_PATH='-I./lib_ifxos/src/include'
 AC_ARG_ENABLE(ifxos-include,
@@ -675,6 +713,24 @@ AC_ARG_ENABLE(debug-prints,
     ]
 )
 
+dnl Enable JSON parsing support
+AM_CONDITIONAL(INCLUDE_DSL_JSON_PARSING, false)
+AC_SUBST([INCLUDE_DSL_JSON_PARSING],[no])
+AC_ARG_ENABLE(libjson-c-support,
+    AC_HELP_STRING([--enable-libjson-c-support=x],[Enable JSON parsing support.]),
+    [
+        if test "$enableval" = yes; then
+            AC_CHECK_HEADERS([json-c/json.h],[libjson_c_path=yes; break;],,)
+
+            if test "x$libjson_c_path" = "xyes"; then
+                AC_DEFINE([INCLUDE_DSL_JSON_PARSING],[1], [Include JSON parsing])
+                AM_CONDITIONAL([INCLUDE_DSL_JSON_PARSING], true)
+                AC_SUBST([INCLUDE_DSL_JSON_PARSING],[yes])
+            fi
+        fi
+    ],
+)
+
 dnl enable FW request support
 AM_CONDITIONAL(INCLUDE_FW_REQUEST_SUPPORT, false)
 AC_ARG_ENABLE(dsl_fw_request,
@@ -2009,6 +2065,71 @@ AC_ARG_ENABLE(dti-agent-st-alone-support,
     ]
 )
 
+dnl enable SAFE C support
+AM_CONDITIONAL(SAFEC_SUPPORT, false)
+AC_SUBST([SAFEC_SUPPORT],[no])
+AC_ARG_ENABLE(safec-support,
+    AC_HELP_STRING([--enable-safec-support=x],[Enable SAFE C support]),
+    [
+        if test "$enableval" = yes; then
+            AC_CHECK_HEADERS([safe_lib.h],[safec_header_support=yes; break;],,)
+
+            if test "x$safec_header_support" = "xyes"; then
+                AC_CHECK_LIB([safec-3.3], [_strcat_s_chk], [safec_lib_ver=3; break;],,,)
+
+                if test "x$safec_lib_ver" = "x3"; then
+                    AC_DEFINE([SAFEC_SUPPORT], [3], [Safe-C lib ver3.3 support])
+                    AM_CONDITIONAL(SAFEC_SUPPORT, true)
+                    AC_SUBST([SAFEC_SUPPORT], [yes])
+                    AC_SUBST([SAFEC_LIB_NAME], [safec-3.3])
+                fi
+            fi
+        fi
+    ],
+)
+
+dnl set system SAFE C include path
+DEFAULT_SAFEC_INCL_PATH=''
+AC_ARG_ENABLE(safec-include,
+    AS_HELP_STRING(
+        [--enable-safec-include= -I./STAGING_DIR/usr/include],[Set the SAFE C include path]
+    ),
+    [
+        if test -n "$enableval"; then
+            echo Set the SAFE C include path to $enableval
+            AC_SUBST([SAFEC_INCL_PATH],[$enableval])
+
+        else
+            AC_SUBST([SAFEC_INCL_PATH],[$DEFAULT_SAFEC_INCL_PATH])
+        fi
+    ],
+    [
+        AC_SUBST([SAFEC_INCL_PATH],[$DEFAULT_SAFEC_INCL_PATH])
+    ]
+)
+
+dnl set system SAFE C library path
+DEFAULT_SAFEC_LIB_PATH=''
+AC_ARG_ENABLE(safec-library,
+    AS_HELP_STRING(
+        [--enable-safec-library= -L./STAGING_DIR/usr/lib],[Set the SAFE C
+        library path]
+    ),
+    [
+        if test -n "$enableval"; then
+            echo Set the SAFE C library path to $enableval
+            AC_SUBST([SAFEC_LIB_PATH],[$enableval])
+
+        else
+            AC_SUBST([SAFEC_LIB_PATH],[$DEFAULT_SAFEC_LIB_PATH])
+        fi
+    ],
+    [
+        AC_SUBST([SAFEC_LIB_PATH],[$DEFAULT_SAFEC_LIB_PATH])
+    ]
+)
+
+
 dnl Set the configure params for dist check
 
 AC_SUBST([DISTCHECK_CONFIGURE_PARAMS],[$CONFIGURE_OPTIONS])
@@ -2088,6 +2209,13 @@ echo -e "  Include real time trace support:  $INCLUDE_REAL_TIME_TRACE"
 echo -e "  Include debug logger support:     $INCLUDE_DSL_CPE_DEBUG_LOGGER_SUPPORT"
 echo -e "  Netlink ID of the debug messages: $DSL_DBG_MSG_NETLINK_ID"
 echo -e "  Include DTI agent stand-alone:    $INCLUDE_DTI_AGENT_STANDALONE_SUPPORT"
+echo -e "  Safe-C support:                   $SAFEC_SUPPORT"
+echo -e "  Safe-C include path:              $SAFEC_INCL_PATH"
+echo -e "  Safe-C library path:              $SAFEC_LIB_PATH"
+echo -e "  Safe-C library:                   $SAFEC_LIB_NAME"
+echo -e "  Include JSON parser:              $INCLUDE_DSL_JSON_PARSING"
+echo -e "  JSON C include path:              $LIBJSON_C_INCL_PATH"
+echo -e "  JSON C library path:              $LIBJSON_C_LIBRARY_PATH"
 echo -e "----------------------- deprectated ! ----------------------------------"
 echo -e "  currently no such functions"
 echo -e "------------------------------------------------------------------------"
diff --git a/depcomp b/depcomp
index fc98710e2a1df7159cd72a01ffc011784748c3bc..b39f98f9ae9f950391abb09f4fa03ee113a07ac6 100755
--- a/depcomp
+++ b/depcomp
@@ -1,9 +1,9 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2013-05-30.07; # UTC
+scriptversion=2016-01-11.22; # UTC
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 
 # 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
@@ -786,6 +786,6 @@ exit 0
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
 # time-stamp-end: "; # UTC"
 # End:
diff --git a/install-sh b/install-sh
index 0b0fdcbba69ab6dd05ca162a5328828d46ab1d54..0360b79e7d020a2059f5127a03cd14269969bde9 100755
--- a/install-sh
+++ b/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2013-12-25.23; # UTC
+scriptversion=2016-01-11.22; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -496,6 +496,6 @@ done
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
 # time-stamp-end: "; # UTC"
 # End:
diff --git a/missing b/missing
index f62bbae306c7e1bc28896aab8fe7bfb700a9a33e..c6e379584baf766f931c6ec18292a2c3dbe0eb90 100755
--- a/missing
+++ b/missing
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Common wrapper for a few potentially missing GNU programs.
 
-scriptversion=2013-10-28.13; # UTC
+scriptversion=2016-01-11.22; # UTC
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
@@ -210,6 +210,6 @@ exit $st
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
+# time-stamp-time-zone: "UTC0"
 # time-stamp-end: "; # UTC"
 # End:
diff --git a/src/Makefile.am b/src/Makefile.am
index a2e6b9175f4460beee9b5d6b6f8098c1a0aefc08..c0ce2e6871e69785925e636a4de2b05c3a4163d9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -22,7 +22,15 @@ if INCLUDE_DSL_CPE_IFXOS_SUPPORT
     dsl_cpe_control_LDADD += -lifxos
 endif
 
+if SAFEC_SUPPORT
+AM_CPPFLAGS += @SAFEC_INCL_PATH@
+dsl_cpe_control_LDADD += -l@SAFEC_LIB_NAME@
+endif
 
+if INCLUDE_DSL_JSON_PARSING
+AM_CPPFLAGS += @LIBJSON_C_INCL_PATH@
+dsl_cpe_control_LDADD += -ljson-c
+endif
 
 bin_SCRIPTS = ../scripts/alias_dsl_cpe.sh
 
@@ -37,6 +45,16 @@ dsl_cpe_control_cli_sources = \
 	dsl_cpe_cli_access.c \
 	dsl_cpe_cli_console.c
 
+if INCLUDE_DSL_JSON_PARSING
+dsl_cpe_configuration_parser_sources = \
+	dsl_cpe_configuration_parser.c
+dsl_cpe_status_parser_sources = \
+	dsl_cpe_status_parser.c
+else
+dsl_cpe_configuration_parser_sources =
+dsl_cpe_status_parser_sources =
+endif
+
 dsl_cpe_control_cli_autogen_sources = \
 	dsl_cpe_cli_access2.c \
 	dsl_cpe_cli_autogen.c
@@ -98,6 +116,12 @@ dsl_cpe_control_SOURCES += \
 	$(dsl_cpe_control_cli_danube_sources)
 endif
 
+if INCLUDE_DSL_JSON_PARSING
+dsl_cpe_control_SOURCES += \
+	$(dsl_cpe_configuration_parser_sources) \
+	$(dsl_cpe_status_parser_sources)
+endif
+
 if DEVICE_VRX
 dsl_cpe_control_SOURCES += \
 	$(dsl_cpe_control_cli_vrx_sources)
@@ -114,6 +138,8 @@ EXTRA_DIST = \
 	$(dsl_cpe_control_cli_vrx_sources) \
 	$(dsl_cpe_control_debug_danube_sources) \
 	$(dsl_cpe_control_debug_vrx_sources) \
+	$(dsl_cpe_configuration_parser_sources) \
+	$(dsl_cpe_status_parser_sources) \
 	dsl_cpe_control.h \
 	dsl_cpe_init_cfg.h \
 	dsl_cpe_cli.h \
@@ -137,7 +163,14 @@ EXTRA_DIST = \
 	dsl_cpe_debug_vrx.h \
 	../scripts/alias_dsl_cpe.sh \
 	../scripts/dsl_cpe_pipe.sh \
-	../tools/pipe/dsl_pipe_client.h
+	../tools/pipe/dsl_pipe_client.h \
+	dsl_cpe_safec_wrapper.h
+
+if INCLUDE_DSL_JSON_PARSING
+EXTRA_DIST += \
+   dsl_cpe_configuration_parser.h \
+   dsl_cpe_status_parser.h
+endif
 
 if ADD_APPL_CFLAGS_SET
 dsl_cpe_control_cflags = $(ADD_APPL_CFLAGS)
@@ -163,6 +196,20 @@ else
 dsl_cpe_control_dti_ldflags =
 endif
 
+if SAFEC_SUPPORT
+dsl_cpe_control_safec_ldflags = @SAFEC_LIB_PATH@
+else
+dsl_cpe_control_safec_ldflags =
+endif
+
+if INCLUDE_DSL_JSON_PARSING
+dsl_cpe_control_json_parsing_cflags = -DINCLUDE_DSL_JSON_PARSING=1
+dsl_cpe_control_json_c_ldflags = @LIBJSON_C_LIBRARY_PATH@
+else
+dsl_cpe_control_json_parsing_cflags = 
+dsl_cpe_control_json_c_ldflags =
+endif
+
 dsl_cpe_control_common_cflags = -Wall -Wimplicit -Wreturn-type -Wunused -Wundef \
 	-Wswitch -Wno-format -Wcomment -Wuninitialized -DLINUX -g3 
 
@@ -180,14 +227,16 @@ endif
 dsl_cpe_control_CFLAGS = $(dsl_cpe_control_common_cflags) \
                          $(dsl_cpe_control_cflags) \
                          $(dsl_cpe_control_compile_cflags) \
-                         $(dsl_cpe_control_external_cflags)
+                         $(dsl_cpe_control_external_cflags) \
+                         $(dsl_cpe_control_json_parsing_cflags)
 
 dsl_cpe_control_LDFLAGS = $(dsl_cpe_control_common_ldflags) \
                           $(dsl_cpe_control_ldflags) \
                           $(dsl_cpe_control_compile_cflags) \
                           $(dsl_cpe_control_ifxos_ldflags) \
-                          $(dsl_cpe_control_dti_ldflags)
-
+                          $(dsl_cpe_control_dti_ldflags) \
+                          $(dsl_cpe_control_safec_ldflags) \
+                          $(dsl_cpe_control_json_c_ldflags)
 
 lint:
 	@flint +b -vm \
diff --git a/src/Makefile.in b/src/Makefile.in
index 2c7cba73add2089aa5537a8ac0778c87327b9cd8..f3048b6e8454a2a9ec60f777fe7aca67696b57d8 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -90,25 +90,37 @@ POST_UNINSTALL = :
 bin_PROGRAMS = dsl_cpe_control$(EXEEXT)
 @INCLUDE_DSL_CPE_DTI_SUPPORT_TRUE@am__append_1 = -ldti_agent -lifxos
 @INCLUDE_DSL_CPE_IFXOS_SUPPORT_TRUE@am__append_2 = -lifxos
-@DEVICE_DANUBE_TRUE@am__append_3 = \
+@SAFEC_SUPPORT_TRUE@am__append_3 = @SAFEC_INCL_PATH@
+@SAFEC_SUPPORT_TRUE@am__append_4 = -l@SAFEC_LIB_NAME@
+@INCLUDE_DSL_JSON_PARSING_TRUE@am__append_5 = @LIBJSON_C_INCL_PATH@
+@INCLUDE_DSL_JSON_PARSING_TRUE@am__append_6 = -ljson-c
+@DEVICE_DANUBE_TRUE@am__append_7 = \
 @DEVICE_DANUBE_TRUE@	$(dsl_cpe_control_debug_danube_sources)
 
-@DEVICE_VRX_LAYER_TRUE@am__append_4 = \
+@DEVICE_VRX_LAYER_TRUE@am__append_8 = \
 @DEVICE_VRX_LAYER_TRUE@	$(dsl_cpe_control_debug_vrx_sources)
 
-@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__append_5 = \
+@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__append_9 = \
 @INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@	$(dsl_cpe_control_cli_sources)
 
-@INCLUDE_DSL_CPE_CLI_AUTOGEN_SUPPORT_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__append_6 = \
+@INCLUDE_DSL_CPE_CLI_AUTOGEN_SUPPORT_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__append_10 = \
 @INCLUDE_DSL_CPE_CLI_AUTOGEN_SUPPORT_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@	$(dsl_cpe_control_cli_autogen_sources)
 
-@DEVICE_DANUBE_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__append_7 = \
+@DEVICE_DANUBE_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__append_11 = \
 @DEVICE_DANUBE_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@	$(dsl_cpe_control_cli_danube_sources)
 
-@DEVICE_VRX_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__append_8 = \
+@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@@INCLUDE_DSL_JSON_PARSING_TRUE@am__append_12 = \
+@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@@INCLUDE_DSL_JSON_PARSING_TRUE@	$(dsl_cpe_configuration_parser_sources) \
+@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@@INCLUDE_DSL_JSON_PARSING_TRUE@	$(dsl_cpe_status_parser_sources)
+
+@DEVICE_VRX_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__append_13 = \
 @DEVICE_VRX_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@	$(dsl_cpe_control_cli_vrx_sources)
 
-@DSL_CCA_DBG_MAX_LEVEL_SET_TRUE@am__append_9 = -DDSL_CCA_DBG_MAX_LEVEL=$(DSL_CCA_DBG_MAX_LEVEL_PRE)
+@INCLUDE_DSL_JSON_PARSING_TRUE@am__append_14 = \
+@INCLUDE_DSL_JSON_PARSING_TRUE@   dsl_cpe_configuration_parser.h \
+@INCLUDE_DSL_JSON_PARSING_TRUE@   dsl_cpe_status_parser.h
+
+@DSL_CCA_DBG_MAX_LEVEL_SET_TRUE@am__append_15 = -DDSL_CCA_DBG_MAX_LEVEL=$(DSL_CCA_DBG_MAX_LEVEL_PRE)
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/configure.in
@@ -127,7 +139,9 @@ am__dsl_cpe_control_SOURCES_DIST = dsl_cpe_control.c \
 	dsl_cpe_debug_vrx.c dsl_cpe_bnd_vrx.c dsl_cpe_cli.c \
 	dsl_cpe_cli_pipe.c dsl_cpe_cli_access.c dsl_cpe_cli_console.c \
 	dsl_cpe_cli_access2.c dsl_cpe_cli_autogen.c \
-	dsl_cpe_cli_danube.c dsl_cpe_cli_mib.c dsl_cpe_cli_vrx.c
+	dsl_cpe_cli_danube.c dsl_cpe_cli_mib.c \
+	dsl_cpe_configuration_parser.c dsl_cpe_status_parser.c \
+	dsl_cpe_cli_vrx.c
 @INCLUDE_DSL_CPE_DTI_SUPPORT_TRUE@am__objects_1 = dsl_cpe_control-dsl_cpe_dti.$(OBJEXT) \
 @INCLUDE_DSL_CPE_DTI_SUPPORT_TRUE@	dsl_cpe_control-dsl_cpe_dti_vrx.$(OBJEXT)
 am__objects_2 = dsl_cpe_control-dsl_cpe_debug_danube.$(OBJEXT)
@@ -147,8 +161,12 @@ am__objects_9 = dsl_cpe_control-dsl_cpe_cli_access2.$(OBJEXT) \
 am__objects_11 = dsl_cpe_control-dsl_cpe_cli_danube.$(OBJEXT) \
 	dsl_cpe_control-dsl_cpe_cli_mib.$(OBJEXT)
 @DEVICE_DANUBE_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__objects_12 = $(am__objects_11)
-am__objects_13 = dsl_cpe_control-dsl_cpe_cli_vrx.$(OBJEXT)
-@DEVICE_VRX_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__objects_14 = $(am__objects_13)
+@INCLUDE_DSL_JSON_PARSING_TRUE@am__objects_13 = dsl_cpe_control-dsl_cpe_configuration_parser.$(OBJEXT)
+@INCLUDE_DSL_JSON_PARSING_TRUE@am__objects_14 = dsl_cpe_control-dsl_cpe_status_parser.$(OBJEXT)
+@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@@INCLUDE_DSL_JSON_PARSING_TRUE@am__objects_15 = $(am__objects_13) \
+@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@@INCLUDE_DSL_JSON_PARSING_TRUE@	$(am__objects_14)
+am__objects_16 = dsl_cpe_control-dsl_cpe_cli_vrx.$(OBJEXT)
+@DEVICE_VRX_TRUE@@INCLUDE_DSL_CPE_CLI_SUPPORT_TRUE@am__objects_17 = $(am__objects_16)
 am_dsl_cpe_control_OBJECTS =  \
 	dsl_cpe_control-dsl_cpe_control.$(OBJEXT) \
 	dsl_cpe_control-dsl_cpe_init_cfg.$(OBJEXT) \
@@ -156,10 +174,11 @@ am_dsl_cpe_control_OBJECTS =  \
 	dsl_cpe_control-dsl_cpe_debug.$(OBJEXT) $(am__objects_1) \
 	$(am__objects_3) $(am__objects_5) $(am__objects_6) \
 	$(am__objects_8) $(am__objects_10) $(am__objects_12) \
-	$(am__objects_14)
+	$(am__objects_15) $(am__objects_17)
 dsl_cpe_control_OBJECTS = $(am_dsl_cpe_control_OBJECTS)
 am__DEPENDENCIES_1 =
 dsl_cpe_control_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1)
 dsl_cpe_control_LINK = $(CCLD) $(dsl_cpe_control_CFLAGS) $(CFLAGS) \
 	$(dsl_cpe_control_LDFLAGS) $(LDFLAGS) -o $@
@@ -334,6 +353,7 @@ INCLUDE_DSL_G997_FRAMING_PARAMETERS = @INCLUDE_DSL_G997_FRAMING_PARAMETERS@
 INCLUDE_DSL_G997_LINE_INVENTORY = @INCLUDE_DSL_G997_LINE_INVENTORY@
 INCLUDE_DSL_G997_PER_TONE = @INCLUDE_DSL_G997_PER_TONE@
 INCLUDE_DSL_G997_STATUS = @INCLUDE_DSL_G997_STATUS@
+INCLUDE_DSL_JSON_PARSING = @INCLUDE_DSL_JSON_PARSING@
 INCLUDE_DSL_PM = @INCLUDE_DSL_PM@
 INCLUDE_DSL_RESOURCE_STATISTICS = @INCLUDE_DSL_RESOURCE_STATISTICS@
 INCLUDE_DSL_SYSTEM_INTERFACE = @INCLUDE_DSL_SYSTEM_INTERFACE@
@@ -348,6 +368,8 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 LDFLAGS = @LDFLAGS@
+LIBJSON_C_INCL_PATH = @LIBJSON_C_INCL_PATH@
+LIBJSON_C_LIBRARY_PATH = @LIBJSON_C_LIBRARY_PATH@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LTLIBOBJS = @LTLIBOBJS@
@@ -362,6 +384,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+SAFEC_INCL_PATH = @SAFEC_INCL_PATH@
+SAFEC_LIB_NAME = @SAFEC_LIB_NAME@
+SAFEC_LIB_PATH = @SAFEC_LIB_PATH@
+SAFEC_SUPPORT = @SAFEC_SUPPORT@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -408,10 +434,13 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I@srcdir@ @DSL_DRIVER_INCL_PATH@ @DSL_DEVICE_DRIVER_INCL_PATH@ @IFXOS_INCLUDE_PATH@ @DTI_INCL_PATH@
+AM_CPPFLAGS = -I@srcdir@ @DSL_DRIVER_INCL_PATH@ \
+	@DSL_DEVICE_DRIVER_INCL_PATH@ @IFXOS_INCLUDE_PATH@ \
+	@DTI_INCL_PATH@ $(am__append_3) $(am__append_5)
 @DSL_CPE_STATIC_LINKING_FALSE@dsl_cpe_control_common_ldflags = 
 @DSL_CPE_STATIC_LINKING_TRUE@dsl_cpe_control_common_ldflags = -static
-dsl_cpe_control_LDADD = -lpthread -lrt $(am__append_1) $(am__append_2)
+dsl_cpe_control_LDADD = -lpthread -lrt $(am__append_1) $(am__append_2) \
+	$(am__append_4) $(am__append_6)
 bin_SCRIPTS = ../scripts/alias_dsl_cpe.sh
 @DEVICE_VRX_TRUE@dsl_cpe_control_bnd_sources = \
 @DEVICE_VRX_TRUE@   dsl_cpe_bnd_vrx.c
@@ -422,6 +451,14 @@ dsl_cpe_control_cli_sources = \
 	dsl_cpe_cli_access.c \
 	dsl_cpe_cli_console.c
 
+@INCLUDE_DSL_JSON_PARSING_FALSE@dsl_cpe_configuration_parser_sources = 
+@INCLUDE_DSL_JSON_PARSING_TRUE@dsl_cpe_configuration_parser_sources = \
+@INCLUDE_DSL_JSON_PARSING_TRUE@	dsl_cpe_configuration_parser.c
+
+@INCLUDE_DSL_JSON_PARSING_FALSE@dsl_cpe_status_parser_sources = 
+@INCLUDE_DSL_JSON_PARSING_TRUE@dsl_cpe_status_parser_sources = \
+@INCLUDE_DSL_JSON_PARSING_TRUE@	dsl_cpe_status_parser.c
+
 dsl_cpe_control_cli_autogen_sources = \
 	dsl_cpe_cli_access2.c \
 	dsl_cpe_cli_autogen.c
@@ -446,43 +483,27 @@ dsl_cpe_control_debug_vrx_sources = \
 
 dsl_cpe_control_SOURCES = dsl_cpe_control.c dsl_cpe_init_cfg.c \
 	dsl_cpe_linux.c dsl_cpe_debug.c $(dsl_cpe_control_dti_sources) \
-	$(am__append_3) $(am__append_4) $(dsl_cpe_control_bnd_sources) \
-	$(am__append_5) $(am__append_6) $(am__append_7) \
-	$(am__append_8)
-EXTRA_DIST = \
-	../LICENSE \
-	$(dsl_cpe_control_bnd_sources) \
-	$(dsl_cpe_control_cli_sources) \
-	$(dsl_cpe_control_dti_sources) \
+	$(am__append_7) $(am__append_8) $(dsl_cpe_control_bnd_sources) \
+	$(am__append_9) $(am__append_10) $(am__append_11) \
+	$(am__append_12) $(am__append_13)
+EXTRA_DIST = ../LICENSE $(dsl_cpe_control_bnd_sources) \
+	$(dsl_cpe_control_cli_sources) $(dsl_cpe_control_dti_sources) \
 	$(dsl_cpe_control_cli_danube_sources) \
 	$(dsl_cpe_control_cli_vrx_sources) \
 	$(dsl_cpe_control_debug_danube_sources) \
 	$(dsl_cpe_control_debug_vrx_sources) \
-	dsl_cpe_control.h \
-	dsl_cpe_init_cfg.h \
-	dsl_cpe_cli.h \
-	dsl_cpe_dti.h \
-	dsl_cpe_dti_vrx_ctx.h \
-	dsl_cpe_bnd_vrx.h \
-	dsl_cpe_cli_console.h \
-	dsl_cpe_simulator.c \
-	dsl_cpe_simulator.h \
-	dsl_cpe_win32.c \
-	dsl_cpe_win32.h \
-	dsl_cpe_os.h \
-	dsl_cpe_os_lint_map.h \
-	dsl_cpe_linux.h \
-	dsl_cpe_vxworks.c \
-	dsl_cpe_vxworks.h \
-	dsl_cpe_rtems.c \
-	dsl_cpe_rtems.h \
-	dsl_cpe_debug.h \
-	dsl_cpe_debug_danube.h \
-	dsl_cpe_debug_vrx.h \
-	../scripts/alias_dsl_cpe.sh \
-	../scripts/dsl_cpe_pipe.sh \
-	../tools/pipe/dsl_pipe_client.h
-
+	$(dsl_cpe_configuration_parser_sources) \
+	$(dsl_cpe_status_parser_sources) dsl_cpe_control.h \
+	dsl_cpe_init_cfg.h dsl_cpe_cli.h dsl_cpe_dti.h \
+	dsl_cpe_dti_vrx_ctx.h dsl_cpe_bnd_vrx.h dsl_cpe_cli_console.h \
+	dsl_cpe_simulator.c dsl_cpe_simulator.h dsl_cpe_win32.c \
+	dsl_cpe_win32.h dsl_cpe_os.h dsl_cpe_os_lint_map.h \
+	dsl_cpe_linux.h dsl_cpe_vxworks.c dsl_cpe_vxworks.h \
+	dsl_cpe_rtems.c dsl_cpe_rtems.h dsl_cpe_debug.h \
+	dsl_cpe_debug_danube.h dsl_cpe_debug_vrx.h \
+	../scripts/alias_dsl_cpe.sh ../scripts/dsl_cpe_pipe.sh \
+	../tools/pipe/dsl_pipe_client.h dsl_cpe_safec_wrapper.h \
+	$(am__append_14)
 @ADD_APPL_CFLAGS_SET_FALSE@dsl_cpe_control_cflags = 
 @ADD_APPL_CFLAGS_SET_TRUE@dsl_cpe_control_cflags = $(ADD_APPL_CFLAGS)
 @ADD_APPL_LDFLAGS_SET_FALSE@dsl_cpe_control_ldflags = 
@@ -491,9 +512,15 @@ EXTRA_DIST = \
 @INCLUDE_DSL_CPE_IFXOS_SUPPORT_TRUE@dsl_cpe_control_ifxos_ldflags = @IFXOS_LIBRARY_PATH@
 @INCLUDE_DSL_CPE_DTI_SUPPORT_FALSE@dsl_cpe_control_dti_ldflags = 
 @INCLUDE_DSL_CPE_DTI_SUPPORT_TRUE@dsl_cpe_control_dti_ldflags = @DTI_LIBRARY_PATH@
+@SAFEC_SUPPORT_FALSE@dsl_cpe_control_safec_ldflags = 
+@SAFEC_SUPPORT_TRUE@dsl_cpe_control_safec_ldflags = @SAFEC_LIB_PATH@
+@INCLUDE_DSL_JSON_PARSING_FALSE@dsl_cpe_control_json_parsing_cflags = 
+@INCLUDE_DSL_JSON_PARSING_TRUE@dsl_cpe_control_json_parsing_cflags = -DINCLUDE_DSL_JSON_PARSING=1
+@INCLUDE_DSL_JSON_PARSING_FALSE@dsl_cpe_control_json_c_ldflags = 
+@INCLUDE_DSL_JSON_PARSING_TRUE@dsl_cpe_control_json_c_ldflags = @LIBJSON_C_LIBRARY_PATH@
 dsl_cpe_control_common_cflags = -Wall -Wimplicit -Wreturn-type \
 	-Wunused -Wundef -Wswitch -Wno-format -Wcomment \
-	-Wuninitialized -DLINUX -g3 $(am__append_9)
+	-Wuninitialized -DLINUX -g3 $(am__append_15)
 
 # compile cflags
 dsl_cpe_control_compile_cflags = $(EXTRA_APP_CFLAGS)
@@ -501,13 +528,16 @@ dsl_cpe_control_compile_cflags = $(EXTRA_APP_CFLAGS)
 dsl_cpe_control_CFLAGS = $(dsl_cpe_control_common_cflags) \
                          $(dsl_cpe_control_cflags) \
                          $(dsl_cpe_control_compile_cflags) \
-                         $(dsl_cpe_control_external_cflags)
+                         $(dsl_cpe_control_external_cflags) \
+                         $(dsl_cpe_control_json_parsing_cflags)
 
 dsl_cpe_control_LDFLAGS = $(dsl_cpe_control_common_ldflags) \
                           $(dsl_cpe_control_ldflags) \
                           $(dsl_cpe_control_compile_cflags) \
                           $(dsl_cpe_control_ifxos_ldflags) \
-                          $(dsl_cpe_control_dti_ldflags)
+                          $(dsl_cpe_control_dti_ldflags) \
+                          $(dsl_cpe_control_safec_ldflags) \
+                          $(dsl_cpe_control_json_c_ldflags)
 
 all: dsl_cpe_config.h
 	$(MAKE) $(AM_MAKEFLAGS) all-am
@@ -656,6 +686,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_cli_mib.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_cli_pipe.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_cli_vrx.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_configuration_parser.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_control.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_debug.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_debug_danube.Po@am__quote@
@@ -664,6 +695,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_dti_vrx.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_init_cfg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_linux.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsl_cpe_control-dsl_cpe_status_parser.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -917,6 +949,34 @@ dsl_cpe_control-dsl_cpe_cli_mib.obj: dsl_cpe_cli_mib.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -c -o dsl_cpe_control-dsl_cpe_cli_mib.obj `if test -f 'dsl_cpe_cli_mib.c'; then $(CYGPATH_W) 'dsl_cpe_cli_mib.c'; else $(CYGPATH_W) '$(srcdir)/dsl_cpe_cli_mib.c'; fi`
 
+dsl_cpe_control-dsl_cpe_configuration_parser.o: dsl_cpe_configuration_parser.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -MT dsl_cpe_control-dsl_cpe_configuration_parser.o -MD -MP -MF $(DEPDIR)/dsl_cpe_control-dsl_cpe_configuration_parser.Tpo -c -o dsl_cpe_control-dsl_cpe_configuration_parser.o `test -f 'dsl_cpe_configuration_parser.c' || echo '$(srcdir)/'`dsl_cpe_configuration_parser.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dsl_cpe_control-dsl_cpe_configuration_parser.Tpo $(DEPDIR)/dsl_cpe_control-dsl_cpe_configuration_parser.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dsl_cpe_configuration_parser.c' object='dsl_cpe_control-dsl_cpe_configuration_parser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -c -o dsl_cpe_control-dsl_cpe_configuration_parser.o `test -f 'dsl_cpe_configuration_parser.c' || echo '$(srcdir)/'`dsl_cpe_configuration_parser.c
+
+dsl_cpe_control-dsl_cpe_configuration_parser.obj: dsl_cpe_configuration_parser.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -MT dsl_cpe_control-dsl_cpe_configuration_parser.obj -MD -MP -MF $(DEPDIR)/dsl_cpe_control-dsl_cpe_configuration_parser.Tpo -c -o dsl_cpe_control-dsl_cpe_configuration_parser.obj `if test -f 'dsl_cpe_configuration_parser.c'; then $(CYGPATH_W) 'dsl_cpe_configuration_parser.c'; else $(CYGPATH_W) '$(srcdir)/dsl_cpe_configuration_parser.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dsl_cpe_control-dsl_cpe_configuration_parser.Tpo $(DEPDIR)/dsl_cpe_control-dsl_cpe_configuration_parser.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dsl_cpe_configuration_parser.c' object='dsl_cpe_control-dsl_cpe_configuration_parser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -c -o dsl_cpe_control-dsl_cpe_configuration_parser.obj `if test -f 'dsl_cpe_configuration_parser.c'; then $(CYGPATH_W) 'dsl_cpe_configuration_parser.c'; else $(CYGPATH_W) '$(srcdir)/dsl_cpe_configuration_parser.c'; fi`
+
+dsl_cpe_control-dsl_cpe_status_parser.o: dsl_cpe_status_parser.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -MT dsl_cpe_control-dsl_cpe_status_parser.o -MD -MP -MF $(DEPDIR)/dsl_cpe_control-dsl_cpe_status_parser.Tpo -c -o dsl_cpe_control-dsl_cpe_status_parser.o `test -f 'dsl_cpe_status_parser.c' || echo '$(srcdir)/'`dsl_cpe_status_parser.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dsl_cpe_control-dsl_cpe_status_parser.Tpo $(DEPDIR)/dsl_cpe_control-dsl_cpe_status_parser.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dsl_cpe_status_parser.c' object='dsl_cpe_control-dsl_cpe_status_parser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -c -o dsl_cpe_control-dsl_cpe_status_parser.o `test -f 'dsl_cpe_status_parser.c' || echo '$(srcdir)/'`dsl_cpe_status_parser.c
+
+dsl_cpe_control-dsl_cpe_status_parser.obj: dsl_cpe_status_parser.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -MT dsl_cpe_control-dsl_cpe_status_parser.obj -MD -MP -MF $(DEPDIR)/dsl_cpe_control-dsl_cpe_status_parser.Tpo -c -o dsl_cpe_control-dsl_cpe_status_parser.obj `if test -f 'dsl_cpe_status_parser.c'; then $(CYGPATH_W) 'dsl_cpe_status_parser.c'; else $(CYGPATH_W) '$(srcdir)/dsl_cpe_status_parser.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dsl_cpe_control-dsl_cpe_status_parser.Tpo $(DEPDIR)/dsl_cpe_control-dsl_cpe_status_parser.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dsl_cpe_status_parser.c' object='dsl_cpe_control-dsl_cpe_status_parser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -c -o dsl_cpe_control-dsl_cpe_status_parser.obj `if test -f 'dsl_cpe_status_parser.c'; then $(CYGPATH_W) 'dsl_cpe_status_parser.c'; else $(CYGPATH_W) '$(srcdir)/dsl_cpe_status_parser.c'; fi`
+
 dsl_cpe_control-dsl_cpe_cli_vrx.o: dsl_cpe_cli_vrx.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dsl_cpe_control_CFLAGS) $(CFLAGS) -MT dsl_cpe_control-dsl_cpe_cli_vrx.o -MD -MP -MF $(DEPDIR)/dsl_cpe_control-dsl_cpe_cli_vrx.Tpo -c -o dsl_cpe_control-dsl_cpe_cli_vrx.o `test -f 'dsl_cpe_cli_vrx.c' || echo '$(srcdir)/'`dsl_cpe_cli_vrx.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dsl_cpe_control-dsl_cpe_cli_vrx.Tpo $(DEPDIR)/dsl_cpe_control-dsl_cpe_cli_vrx.Po
diff --git a/src/dsl_cpe_bnd_vrx.c b/src/dsl_cpe_bnd_vrx.c
index 993559db0b92ea0fa3642602d0d198f35e2a83fd..c4e934accf0bc8e87ea94b385c6b4a925d3cca01 100644
--- a/src/dsl_cpe_bnd_vrx.c
+++ b/src/dsl_cpe_bnd_vrx.c
@@ -1,5 +1,7 @@
 /******************************************************************************
 
+                     Copyright 2018, Intel Corporation
+
                           Copyright (c) 2007-2015
                      Lantiq Beteiligungs-GmbH & Co. KG
 
@@ -123,7 +125,8 @@ static DSL_Error_t DSL_CPE_BND_BondingCheck(
          DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
             "BND - Update Remote Discovery code" DSL_CPE_CRLF));
 
-         memcpy(pBndCtx->remoteDiscoveryCode, status.data.nDiscoveryCode, 6);
+         cpe_control_memcpy_s(pBndCtx->remoteDiscoveryCode, sizeof(pBndCtx->remoteDiscoveryCode),
+                              status.data.nDiscoveryCode, sizeof(status.data.nDiscoveryCode));
 
          DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
             "BND - Remote Discovery code: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x" DSL_CPE_CRLF,
@@ -165,7 +168,8 @@ static DSL_Error_t DSL_CPE_BND_BondingCheck(
 
    memset (&HsContinue, 0, sizeof(DSL_BND_HsContinue_t));
 
-   memcpy(HsContinue.data.nDiscoveryCode, pBndCtx->remoteDiscoveryCode, 6);
+   cpe_control_memcpy_s(HsContinue.data.nDiscoveryCode, sizeof(HsContinue.data.nDiscoveryCode), 
+                        pBndCtx->remoteDiscoveryCode, sizeof(pBndCtx->remoteDiscoveryCode));
    HsContinue.data.nAggregateData = pBndCtx->aggregateReg;
 
    ret = DSL_CPE_Ioctl(fd, DSL_FIO_BND_HS_CONTINUE, (DSL_int_t)&HsContinue);
diff --git a/src/dsl_cpe_cli.c b/src/dsl_cpe_cli.c
index d246c357ae957bb2b99daf529ad8230cc7e0d446..5ebbd61dce6d630de5cce5391ae0bbe09437408b 100644
--- a/src/dsl_cpe_cli.c
+++ b/src/dsl_cpe_cli.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -35,10 +37,6 @@
    #define LOGF_LOG_INFO(...)
 #endif /* LOGGING_ID */
 
-#if defined(INCLUDE_DSL_CPE_CLI_SUPPORT) && !defined(INCLUDE_DSL_CPE_CLI_AUTOGEN_SUPPORT)
-   #include "drv_dsl_cpe_api_ioctl.h"
-#endif
-
 #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
 
 #undef DSL_CCA_DBG_BLOCK
@@ -402,7 +400,7 @@ static DSL_Error_t DSL_CPE_CLI_PrintHelp(
          DSL_CPE_FPrintf(out, DSL_CLI_HELP_MEMORY_ERROR);
          return DSL_ERROR;
       }
-      sprintf(sHelp, psHelp, psCmdLong, psCmdShort);
+      snprintf(sHelp, 4096, psHelp, psCmdLong, psCmdShort);
 
       DSL_CPE_FPrintf (out, "%s", sHelp);
 
@@ -440,7 +438,7 @@ DSL_boolean_t DSL_CPE_CLI_CheckParamNumber(
    DSL_char_t *token;
    DSL_int_t i = 0;
 
-   strncpy (string, pCommands, sizeof(string)-1);
+   cpe_control_strncpy_s(string, sizeof(string)-1, pCommands, strlen(pCommands));
    string[sizeof(string)-1]=0;
 
    /* Get first token */
@@ -586,30 +584,6 @@ DSL_int_t DSL_CPE_CLI_HelpPrint(
    return 0;
 }
 
-DSL_boolean_t DSL_CPE_CLI_CheckPowerDown(
-   DSL_int_t fd,
-   DSL_CPE_File_t *out)
-{
-   DSL_boolean_t retVal = DSL_FALSE;
-   DSL_int_t ret = 0;
-   DSL_AutobootStatus_t nAutobootStatus;
-
-   memset (&nAutobootStatus, 0, sizeof(DSL_AutobootStatus_t));
-   ret = DSL_CPE_Ioctl(fd, DSL_FIO_AUTOBOOT_STATUS_GET, (DSL_int_t)&nAutobootStatus);
-
-   if ((ret < 0) && (nAutobootStatus.accessCtl.nReturn < DSL_SUCCESS))
-   {
-      DSL_CPE_FPrintf (out, "nReturn=%d%s", DSL_CPE_RET_VAL(nAutobootStatus.accessCtl.nReturn));
-   }
-   else if (nAutobootStatus.data.nStatus == DSL_AUTOBOOT_STATUS_SHUTDOWN_PD ||
-            nAutobootStatus.data.nStatus == DSL_AUTOBOOT_STATUS_STOPPED_PD)
-   {
-      retVal = DSL_TRUE;
-   }
-
-   return retVal;
-}
-
 /**
    Execute command.
 
@@ -624,8 +598,6 @@ DSL_int_t DSL_CPE_CLI_CommandExecute(
 {
    DSL_CPE_recType  rec = {DSL_NULL, DSL_NULL, DSL_NULL, 0, DSL_NULL};
    DSL_char_t dummy_arg[10] = "";
-   DSL_boolean_t bCallable = DSL_TRUE;
-   DSL_int_t nQuit = 0;
 
    if(cmd == DSL_NULL)
    {
@@ -658,29 +630,12 @@ DSL_int_t DSL_CPE_CLI_CommandExecute(
          }
          else
          {
-            nQuit = strcmp(cmd, "quit");
-
-            if (DSL_CPE_CLI_CheckPowerDown(fd, out) == DSL_TRUE)
-            {
-               if(!(rec.mask & DSL_CPE_MASK_AFTER_POWER_DOWN) && nQuit != 0)
-               {
-                  bCallable = DSL_FALSE;
-               }
-            }
-
-            if (bCallable == DSL_TRUE)
-            {
-               if(rec.func(fd, arg, out) != 0)
-               {
-                  DSL_CPE_CLI_PrintHelp(rec.psHelp, rec.sCmdLong, rec.sCmdShort, rec.mask, rec.printFunc, out);
-               }
-            }
-            else
+            if (rec.func(fd, arg, out) != 0)
             {
-               DSL_CPE_FPrintf (out, DSL_CPE_RET DSL_CPE_CRLF, DSL_CPE_RET_VAL(DSL_ERR_NOT_SUPPORTED_IN_CURRENT_AUTOBOOT_STATE));
+               DSL_CPE_CLI_PrintHelp(rec.psHelp, rec.sCmdLong, rec.sCmdShort, rec.mask, rec.printFunc, out);
             }
 
-            if (nQuit == 0)
+            if (strcmp(cmd, "quit") == 0)
             {
                DSL_CPE_CLI_Cleanup();
                /* main() will execute exit */
@@ -720,13 +675,13 @@ DSL_int_t DSL_CPE_CLI_CommandExecute(
             break;
 
          case 0:
-            sprintf(file_name,"/bin/%s",cmd);
+            snprintf(file_name, sizeof(file_name),"/bin/%s",cmd);
             execv(file_name,argv);
 
-            sprintf(file_name,"/usr/bin/%s",cmd);
+            snprintf(file_name, sizeof(file_name),"/usr/bin/%s",cmd);
             execv(file_name,argv);
 
-            sprintf(file_name,"/opt/ifx/%s",cmd);
+            snprintf(file_name, sizeof(file_name),"/opt/ifx/%s",cmd);
             execv(file_name,argv);
 
             DSL_CPE_FPrintf(DSL_CPE_STDERR, "%s: command not found" DSL_CPE_CRLF,cmd);
@@ -811,9 +766,6 @@ DSL_Error_t DSL_CPE_CLI_CommandAdd(
    if(strstr(name, "g997") != 0)
    {
       rec.mask |= DSL_CPE_MASK_G997;
-
-      if(strstr(name, "g997lis") != 0)
-         rec.mask |= DSL_CPE_MASK_AFTER_POWER_DOWN;
    }
    else if(long_name[0] == 'P' && long_name[1] == 'M')
    {
@@ -827,22 +779,6 @@ DSL_Error_t DSL_CPE_CLI_CommandAdd(
    {
       rec.mask |= DSL_CPE_MASK_DSM;
    }
-   else if(
-      strstr(name, "esmcs")      != 0 ||
-      strstr(name, "lfcg")       != 0 ||
-      strstr(name, "lfcs")       != 0 ||
-      strstr(name, "fdsg")       != 0 ||
-      strstr(name, "acs")        != 0 ||
-      strstr(name, "help")       != 0 ||
-      strstr(name, "vig")        != 0 ||
-      strstr(name, "asg")        != 0 ||
-      strstr(name, "dbgmls")     != 0 ||
-      strstr(name, "dbgmlg")     != 0 ||
-      strstr(name, "ccadbgmls")  != 0 ||
-      strstr(name, "ccadbgmlg")  != 0)
-   {
-      rec.mask |= DSL_CPE_MASK_AFTER_POWER_DOWN;
-   }
    else
    {
       rec.mask |= DSL_CPE_MASK_DEVICE;
@@ -853,14 +789,14 @@ DSL_Error_t DSL_CPE_CLI_CommandAdd(
    rec.sCmdShort = malloc(strlen(name)+1);
    if(rec.sCmdShort)
    {
-      strcpy(rec.sCmdShort, name);
+      cpe_control_strncpy_s(rec.sCmdShort, strlen(name)+1, name, strlen(name));
       rec.sCmdShort[strlen(name)] = 0;
    }
 
    rec.sCmdLong = malloc(strlen(long_name)+1);
    if(rec.sCmdLong)
    {
-      strcpy(rec.sCmdLong, long_name);
+      cpe_control_strncpy_s(rec.sCmdLong, strlen(long_name)+1, long_name, strlen(long_name));
       rec.sCmdLong[strlen(long_name)] = 0;
    }
 
@@ -1049,7 +985,7 @@ static DSL_CPE_statusEnum DSL_CPE_keyInsert(DSL_CPE_keyType key, DSL_CPE_recType
     x->left = DSL_NULL;
     x->right = DSL_NULL;
     x->key = key;
-    memcpy ((void *)&x->rec, (void *)rec,  sizeof(DSL_CPE_recType));
+    cpe_control_memcpy_s((void *)&x->rec, sizeof(DSL_CPE_recType), (void *)rec, sizeof(DSL_CPE_recType));
 
     /* insert x in tree */
     if(parent)
@@ -1138,7 +1074,7 @@ DSL_CPE_statusEnum DSL_CPE_keyFind(DSL_CPE_keyType key, DSL_CPE_recType *rec)
     {
         if(compEQ(key, current->key))
         {
-            memcpy ((void *)rec, (void *)&current->rec,  sizeof(DSL_CPE_recType));
+            cpe_control_memcpy_s((void *)rec, sizeof(DSL_CPE_recType), (void *)&current->rec, sizeof(DSL_CPE_recType));
 
             return DSL_CPE_STATUS_OK;
         }
@@ -1324,11 +1260,11 @@ DSL_Error_t DSL_CPE_CLI_PrintHelpDevice(
    }
    if (!pCtrlCtx->bBackwardCompMode)
    {
-      sprintf (sHelp, psHelp, psCmdLong, psCmdShort, sDeviceHelp, sDeviceHelp);
+      snprintf(sHelp, 4096, psHelp, psCmdLong, psCmdShort, sDeviceHelp, sDeviceHelp);
    }
    else
    {
-      sprintf (sHelp, psHelp, psCmdLong, psCmdShort, "","");
+      snprintf(sHelp, 4096, psHelp, psCmdLong, psCmdShort, "","");
    }
    DSL_CPE_FPrintf(out, "%s", sHelp);
    DSL_CPE_Free(sHelp);
@@ -1355,11 +1291,11 @@ DSL_Error_t DSL_CPE_CLI_PrintHelpDevice1Arg(
    }
    if (!pCtrlCtx->bBackwardCompMode)
    {
-      sprintf (sHelp, psHelp, psCmdLong, psCmdShort, sDeviceHelpInput, sDeviceHelp);
+      snprintf(sHelp, 4096, psHelp, psCmdLong, psCmdShort, sDeviceHelpInput, sDeviceHelp);
    }
    else
    {
-      sprintf(sHelp, psHelp, psCmdLong, psCmdShort, "","");
+      snprintf(sHelp, 4096, psHelp, psCmdLong, psCmdShort, "","");
    }
    DSL_CPE_FPrintf(out, "%s", sHelp);
 
diff --git a/src/dsl_cpe_cli.h b/src/dsl_cpe_cli.h
index a726e83143f34355d47a79d0ca03baee31e9d711..6abee4d917d68d02e35d67b7f2cdf5a2cc6f4190 100644
--- a/src/dsl_cpe_cli.h
+++ b/src/dsl_cpe_cli.h
@@ -1,5 +1,7 @@
 /******************************************************************************
 
+                     Copyright 2018, Intel Corporation
+
                           Copyright (c) 2007-2015
                      Lantiq Beteiligungs-GmbH & Co. KG
 
@@ -15,6 +17,7 @@
    DSL CPE API command line interface
 */
 #include "drv_dsl_cpe_api_error.h"
+#include "dsl_cpe_safec_wrapper.h"
 
 /** maximum arguments, used for spawning a shell with external commands */
 #define DSL_MAX_ARGS                   16
@@ -46,8 +49,6 @@
 #define DSL_CPE_MASK_LONG       0x8000
 /** Deprecated CLI functions */
 #define DSL_CPE_MASK_DEPRECATED 0x10000
-/** Commands available after Power Down mask */
-#define DSL_CPE_MASK_AFTER_POWER_DOWN 0x20000
 
 #define DSL_CPE_CLI_CMD_ADD_COMM(short_name, long_name, pFunc, pHelp) \
            DSL_CPE_CLI_CommandAdd(short_name, long_name, pFunc, pHelp, 0x0, NULL)
diff --git a/src/dsl_cpe_cli_access.c b/src/dsl_cpe_cli_access.c
index b72785ed4621ba6e10b38bb918db4eaeedaf4d16..d83621a4f4825a0325c843bde1d3b4012858cc0d 100644
--- a/src/dsl_cpe_cli_access.c
+++ b/src/dsl_cpe_cli_access.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -558,7 +560,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_NotificationScriptExecuteConfigSet(
 
          if (g_sRcScript)
          {
-            strcpy (g_sRcScript, sNotifyScript);
+            memset(g_sRcScript, 0, strlen (sNotifyScript) + 1);
+            cpe_control_strncpy_s(g_sRcScript, strlen (sNotifyScript) + 1, sNotifyScript, strlen (sNotifyScript));
          }
       }
       else
@@ -758,7 +761,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_AutobootScriptExecuteConfigSet(
             g_sAdslScript = DSL_CPE_Malloc (strlen (sAdslScript) + 1);
             if (g_sAdslScript)
             {
-               strcpy (g_sAdslScript, sAdslScript);
+               memset(g_sAdslScript, 0, strlen (sAdslScript) + 1);
+               cpe_control_strncpy_s(g_sAdslScript, strlen (sAdslScript) + 1, sAdslScript, strlen (sAdslScript));
             }
          }
          else
@@ -789,7 +793,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_AutobootScriptExecuteConfigSet(
             g_sVdslScript = DSL_CPE_Malloc (strlen (sVdslScript) + 1);
             if (g_sVdslScript)
             {
-               strcpy (g_sVdslScript, sVdslScript);
+               memset(g_sVdslScript, 0, strlen (sVdslScript) + 1);
+               cpe_control_strncpy_s(g_sVdslScript, strlen (sVdslScript) + 1, sVdslScript, strlen (sVdslScript));
             }
          }
          else
@@ -1772,6 +1777,10 @@ static const DSL_char_t g_sLfcg[] =
    "   DSL_FEATURE_NA = -1" DSL_CPE_CRLF
    "   DSL_FEATURE_DISABLED = 0" DSL_CPE_CRLF
    "   DSL_FEATURE_ENABLED = 1" DSL_CPE_CRLF
+   "- DSL_FeatureSupport_t bRocEnable" DSL_CPE_CRLF
+   "   DSL_FEATURE_NA = -1" DSL_CPE_CRLF
+   "   DSL_FEATURE_DISABLED = 0" DSL_CPE_CRLF
+   "   DSL_FEATURE_ENABLED = 1" DSL_CPE_CRLF
    DSL_CPE_CRLF "";
 #else
    "";
@@ -1808,11 +1817,11 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_LineFeatureConfigGet(
    {
       DSL_CPE_FPrintf (out, DSL_CPE_RET"nDslMode=%u nDirection=%u "
          "bTrellisEnable=%u bBitswapEnable=%u bReTxEnable=%u "
-         "bVirtualNoiseSupport=%u b20BitSupport=%d" DSL_CPE_CRLF,
+         "bVirtualNoiseSupport=%u b20BitSupport=%d bRocEnable=%d" DSL_CPE_CRLF,
          DSL_CPE_RET_VAL(pData.accessCtl.nReturn), pData.nDslMode,
          pData.nDirection, pData.data.bTrellisEnable, pData.data.bBitswapEnable,
          pData.data.bReTxEnable, pData.data.bVirtualNoiseSupport,
-         pData.data.b20BitSupport);
+         pData.data.b20BitSupport, pData.data.bRocEnable);
    }
 
    return 0;
@@ -1850,6 +1859,10 @@ static const DSL_char_t g_sLfcs[] =
    "   DSL_FEATURE_NA = -1" DSL_CPE_CRLF
    "   DSL_FEATURE_DISABLED = 0" DSL_CPE_CRLF
    "   DSL_FEATURE_ENABLED = 1" DSL_CPE_CRLF
+   "- DSL_FeatureSupport_t bRocEnable" DSL_CPE_CRLF
+   "   DSL_FEATURE_NA = -1" DSL_CPE_CRLF
+   "   DSL_FEATURE_DISABLED = 0" DSL_CPE_CRLF
+   "   DSL_FEATURE_ENABLED = 1" DSL_CPE_CRLF
    DSL_CPE_CRLF
    "Output Parameter" DSL_CPE_CRLF
    "- DSL_Error_t nReturn" DSL_CPE_CRLF
@@ -1881,17 +1894,18 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_LineFeatureConfigSet(
    unsigned int bReTxEnable;
    unsigned int bVirtualNoiseSupport;
    int b20BitSupport;
+   int bRocEnable;
 
-   if (DSL_CPE_CLI_CheckParamNumber(pCommands, 7, DSL_CLI_EQUALS) == DSL_FALSE)
+   if (DSL_CPE_CLI_CheckParamNumber(pCommands, 8, DSL_CLI_EQUALS) == DSL_FALSE)
    {
       return -1;
    }
 
    memset(&pData, 0x0, sizeof(DSL_LineFeature_t));
 
-   sscanf (pCommands, "%d %d %u %u %u %u %d", &nDslMode, &nDirection,
+   sscanf (pCommands, "%d %d %u %u %u %u %d %d", &nDslMode, &nDirection,
       &bTrellisEnable, &bBitswapEnable,
-      &bReTxEnable, &bVirtualNoiseSupport, &b20BitSupport);
+      &bReTxEnable, &bVirtualNoiseSupport, &b20BitSupport, &bRocEnable);
 
    pData.nDslMode = nDslMode;
    pData.nDirection = nDirection;
@@ -1900,6 +1914,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_LineFeatureConfigSet(
    pData.data.bReTxEnable = bReTxEnable;
    pData.data.bVirtualNoiseSupport = bVirtualNoiseSupport;
    pData.data.b20BitSupport = b20BitSupport;
+   pData.data.bRocEnable = bRocEnable;
 
    ret = DSL_CPE_Ioctl (fd, DSL_FIO_LINE_FEATURE_CONFIG_SET, (int) &pData);
 
@@ -1950,6 +1965,10 @@ static const DSL_char_t g_sLfsg[] =
    "   DSL_FEATURE_NA = -1" DSL_CPE_CRLF
    "   DSL_FEATURE_DISABLED = 0" DSL_CPE_CRLF
    "   DSL_FEATURE_ENABLED = 1" DSL_CPE_CRLF
+   "- DSL_FeatureSupport_t bRocEnable" DSL_CPE_CRLF
+   "   DSL_FEATURE_NA = -1" DSL_CPE_CRLF
+   "   DSL_FEATURE_DISABLED = 0" DSL_CPE_CRLF
+   "   DSL_FEATURE_ENABLED = 1" DSL_CPE_CRLF
    DSL_CPE_CRLF "";
 #else
    "";
@@ -1984,10 +2003,12 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_LineFeatureStatusGet(
    else
    {
       DSL_CPE_FPrintf (out, DSL_CPE_RET"nDirection=%u bTrellisEnable=%u "
-         "bBitswapEnable=%u bReTxEnable=%u bVirtualNoiseSupport=%u b20BitSupport=%d" DSL_CPE_CRLF,
+         "bBitswapEnable=%u bReTxEnable=%u bVirtualNoiseSupport=%u b20BitSupport=%d "
+         "bRocEnable=%d" DSL_CPE_CRLF,
          DSL_CPE_RET_VAL(pData.accessCtl.nReturn),
          pData.nDirection, pData.data.bTrellisEnable, pData.data.bBitswapEnable,
-         pData.data.bReTxEnable, pData.data.bVirtualNoiseSupport, pData.data.b20BitSupport);
+         pData.data.bReTxEnable, pData.data.bVirtualNoiseSupport, pData.data.b20BitSupport,
+         pData.data.bRocEnable);
    }
 
    return 0;
@@ -4083,8 +4104,9 @@ static const DSL_char_t g_sG997lisg[] =
    "   LINIT_SUB_S_PP_DRIVER = 7" DSL_CPE_CRLF
    "   LINIT_SUB_S_INTENDED_LOCAL_SHUTDOWN = 8" DSL_CPE_CRLF
    "   LINIT_SUB_TIMEOUT = 9" DSL_CPE_CRLF
-   "   LINIT_SUB_S_PP_CLOCK_NEW = 12" DSL_CPE_CRLF
+   "   LINIT_SUB_S_AUTOMSG = 12" DSL_CPE_CRLF
    "   LINIT_SUB_S_PP_ERB_INIT = 13" DSL_CPE_CRLF
+   "   LINIT_SUB_S_REBOOT_REQ = 14" DSL_CPE_CRLF
    DSL_CPE_CRLF "";
 #else
    "";
@@ -4402,7 +4424,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_G997_LineInventorySet(
 
    memset (&pData, 0, sizeof(DSL_G997_LineInventoryNe_t));
 
-   strncpy (string, pCommands, sizeof(string)-1);
+   cpe_control_strncpy_s(string, sizeof(string)-1, pCommands, strlen(pCommands));
    string[sizeof(string)-1]=0;
 
    /* Get first token */
@@ -4499,6 +4521,8 @@ static const DSL_char_t g_sG997lsg[] =
    "- DSL_uint32_t ATTNDR" DSL_CPE_CRLF
    "- DSL_int16_t ACTPS" DSL_CPE_CRLF
    "- DSL_int16_t ACTATP" DSL_CPE_CRLF
+   "- DSL_int16_t SNR_ROC" DSL_CPE_CRLF
+   "- DSL_int16_t ACTINP_ROC" DSL_CPE_CRLF
    DSL_CPE_CRLF "";
 #else
    "";
@@ -4534,11 +4558,11 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_G997_LineStatusGet(
    else
    {
       DSL_CPE_FPrintf (out, DSL_CPE_RET"nDirection=%u nDeltDataType=%u LATN=%hd SATN=%hd SNR=%hd "
-         "ATTNDR=%u ACTPS=%hd ACTATP=%hd" DSL_CPE_CRLF,
+         "ATTNDR=%u ACTPS=%hd ACTATP=%hd SNR_ROC=%hd ACTINP_ROC=%hd" DSL_CPE_CRLF,
          DSL_CPE_RET_VAL(pData.accessCtl.nReturn),
          pData.nDirection, pData.nDeltDataType, pData.data.LATN,
          (DSL_int32_t)pData.data.SATN, (DSL_int32_t)pData.data.SNR, (DSL_uint32_t)pData.data.ATTNDR, (DSL_int32_t)pData.data.ACTPS,
-         (DSL_int32_t)pData.data.ACTATP);
+         (DSL_int32_t)pData.data.ACTATP, (DSL_int32_t)pData.data.SNR_ROC, (DSL_int32_t)pData.data.ACTINP_ROC);
    }
 
    return 0;
@@ -12770,6 +12794,98 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_PSDCalibrationConfigSet(
    return 0;
 }
 
+static const DSL_char_t g_sOcg[] =
+#ifndef DSL_CPE_DEBUG_DISABLE
+   "Long Form: %s" DSL_CPE_CRLF
+   "Short Form: %s" DSL_CPE_CRLF
+   DSL_CPE_CRLF
+   "Output Parameter" DSL_CPE_CRLF
+   "- DSL_Error_t nReturn" DSL_CPE_CRLF
+   "- DSL_uint16_t nDslOperator" DSL_CPE_CRLF
+   "";
+#else
+   "";
+#endif
+
+DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_OperatorConfigGet(
+   DSL_int_t fd,
+   DSL_char_t *pCommands,
+   DSL_CPE_File_t *out)
+{
+   DSL_int_t ret = 0;
+   DSL_OperatorConfig_t operatorConfig;
+
+   if (DSL_CPE_CLI_CheckParamNumber(pCommands, 0, DSL_CLI_EQUALS) == DSL_FALSE)
+   {
+      return -1;
+   }
+
+   memset(&operatorConfig, 0x0, sizeof(DSL_OperatorConfig_t));
+   ret = DSL_CPE_Ioctl (fd, DSL_FIO_OPERATOR_CONFIG_GET, (int) &operatorConfig);
+
+   if ((ret < 0) && (operatorConfig.accessCtl.nReturn < DSL_SUCCESS))
+   {
+      DSL_CPE_FPrintf (out, sFailureReturn, DSL_CPE_RET_VAL(operatorConfig.accessCtl.nReturn));
+   }
+   else
+   {
+      DSL_CPE_FPrintf (out, DSL_CPE_RET"nDslOperator=%hu" DSL_CPE_CRLF,
+         DSL_CPE_RET_VAL(operatorConfig.accessCtl.nReturn), operatorConfig.data.nDslOperator);
+   }
+
+   return 0;
+}
+
+static const DSL_char_t g_sOcs[] =
+#ifndef DSL_CPE_DEBUG_DISABLE
+   "Long Form: %s" DSL_CPE_CRLF
+   "Short Form: %s" DSL_CPE_CRLF
+   DSL_CPE_CRLF
+   "Input Parameter" DSL_CPE_CRLF
+   "- DSL_uint16_t nDslOperator" DSL_CPE_CRLF
+   DSL_CPE_CRLF
+   "Output Parameter" DSL_CPE_CRLF
+   "- DSL_Error_t nReturn" DSL_CPE_CRLF
+   "";
+#else
+   "";
+#endif
+
+DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_OperatorConfigSet(
+   DSL_int_t fd,
+   DSL_char_t *pCommands,
+   DSL_CPE_File_t *out)
+{
+   DSL_int_t ret = 0;
+   DSL_OperatorConfig_t operatorConfig;
+   DSL_uint16_t nDslOperator;
+
+   if (DSL_CPE_CLI_CheckParamNumber(pCommands, 1, DSL_CLI_EQUALS) == DSL_FALSE)
+   {
+      return -1;
+   }
+
+   memset(&operatorConfig, 0x0, sizeof(DSL_OperatorConfig_t));
+
+   sscanf (pCommands, "%hu", &nDslOperator);
+
+   operatorConfig.data.nDslOperator = nDslOperator;
+
+   ret = DSL_CPE_Ioctl (fd, DSL_FIO_OPERATOR_CONFIG_SET, (int) &operatorConfig);
+
+   if ((ret < 0) && (operatorConfig.accessCtl.nReturn < DSL_SUCCESS))
+   {
+      DSL_CPE_FPrintf (out, sFailureReturn, DSL_CPE_RET_VAL(operatorConfig.accessCtl.nReturn));
+   }
+   else
+   {
+      DSL_CPE_FPrintf (out, DSL_CPE_RET"nDslOperator=%hu" DSL_CPE_CRLF,
+         DSL_CPE_RET_VAL(operatorConfig.accessCtl.nReturn), operatorConfig.data.nDslOperator);
+   }
+
+   return 0;
+}
+
 /**
    Register the CLI commands.
 
@@ -13179,6 +13295,9 @@ DSL_void_t DSL_CPE_CLI_AccessCommandsRegister(DSL_void_t)
 
    DSL_CPE_CLI_CMD_ADD_DEVICE ("pccg", "PsdCalibrationConfigGet", DSL_CPE_CLI_PSDCalibrationConfigGet, g_sPccg);
    DSL_CPE_CLI_CMD_ADD_DEVICE ("pccs", "PsdCalibrationConfigSet", DSL_CPE_CLI_PSDCalibrationConfigSet, g_sPccs);
+
+   DSL_CPE_CLI_CMD_ADD_DEVICE_1ARG ("ocg", "OperatorConfigGet", DSL_CPE_CLI_OperatorConfigGet, g_sOcg);
+   DSL_CPE_CLI_CMD_ADD_DEVICE_1ARG ("ocs", "OperatorConfigSet", DSL_CPE_CLI_OperatorConfigSet, g_sOcs);
 }
 
 #endif /* defined(INCLUDE_DSL_CPE_CLI_SUPPORT) && !defined(INCLUDE_DSL_CPE_CLI_AUTOGEN_SUPPORT) */
diff --git a/src/dsl_cpe_cli_access2.c b/src/dsl_cpe_cli_access2.c
index b3c5722ff3da01888e302a9830af76c4396b5679..5dc9e37c53a554105989103cd80ab3bd9930f0f1 100644
--- a/src/dsl_cpe_cli_access2.c
+++ b/src/dsl_cpe_cli_access2.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -237,7 +239,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_NotificationScriptExecuteConfigSet(
 
          if (g_sRcScript)
          {
-            strcpy (g_sRcScript, sNotifyScript);
+            memset(g_sRcScript, 0, strlen (sNotifyScript) + 1);
+            cpe_control_strncpy_s(g_sRcScript, strlen (sNotifyScript) + 1, sNotifyScript, strlen (sNotifyScript));
          }
       }
       else
@@ -453,7 +456,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_AutobootScriptExecuteConfigSet(
             g_sAdslScript = DSL_CPE_Malloc (strlen (sAdslScript) + 1);
             if (g_sAdslScript)
             {
-               strcpy (g_sAdslScript, sAdslScript);
+               memset(g_sAdslScript, 0, strlen (sAdslScript) + 1);
+               cpe_control_strncpy_s(g_sAdslScript, strlen (sAdslScript) + 1, sAdslScript, strlen (sAdslScript));
             }
          }
          else
@@ -484,7 +488,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_AutobootScriptExecuteConfigSet(
             g_sVdslScript = DSL_CPE_Malloc (strlen (sVdslScript) + 1);
             if (g_sVdslScript)
             {
-               strcpy (g_sVdslScript, sVdslScript);
+               memset(g_sVdslScript, 0, strlen (sVdslScript) + 1);
+               cpe_control_strncpy_s(g_sVdslScript, strlen (sVdslScript) + 1, sVdslScript, strlen (sVdslScript));
             }
          }
          else
@@ -875,7 +880,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_AutobootLoadFirmware(
       g_sFirmwareName1 = DSL_CPE_Malloc (strlen (pcFw) + 1);
       if (g_sFirmwareName1)
       {
-         strcpy (g_sFirmwareName1, pcFw);
+         memset(g_sFirmwareName1, 0, strlen (pcFw) + 1);
+         cpe_control_strncpy_s(g_sFirmwareName1, strlen (pcFw) + 1, pcFw, strlen (pcFw));
       }
       DSL_CPE_FwFeaturesGet(g_sFirmwareName1, &g_nFwFeatures1);
    }
@@ -891,7 +897,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_AutobootLoadFirmware(
       g_sFirmwareName2 = DSL_CPE_Malloc (strlen (pcFw2) + 1);
       if (g_sFirmwareName2)
       {
-         strcpy (g_sFirmwareName2, pcFw2);
+         memset(g_sFirmwareName2, 0, strlen (pcFw2) + 1);
+         cpe_control_strncpy_s(g_sFirmwareName2, strlen (pcFw2) + 1, pcFw2, strlen (pcFw2));
       }
       DSL_CPE_FwFeaturesGet(g_sFirmwareName2, &g_nFwFeatures2);
    }
@@ -1979,7 +1986,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_G997_LineInventorySet(
 
    memset (&pData, 0, sizeof(DSL_G997_LineInventoryNe_t));
 
-   strncpy (string, pCommands, sizeof(string)-1);
+   cpe_control_strncpy_s(string, sizeof(string)-1, pCommands, strlen(pCommands));
    string[sizeof(string)-1]=0;
 
    /* Get first token */
diff --git a/src/dsl_cpe_cli_console.c b/src/dsl_cpe_cli_console.c
index fa392dd7f27745b0537382b1232cbeed135f2147..b19c7aabbb49e57beab5e90d4b5eb578e9d60535 100644
--- a/src/dsl_cpe_cli_console.c
+++ b/src/dsl_cpe_cli_console.c
@@ -1,5 +1,7 @@
 /******************************************************************************
 
+                     Copyright 2018, Intel Corporation
+
                           Copyright (c) 2007-2015
                      Lantiq Beteiligungs-GmbH & Co. KG
 
@@ -434,9 +436,10 @@ DSL_Error_t DSL_CPE_Handle_Console (DSL_CPE_Console_Context_t * pConsoleContext)
 
          if (strlen (pConsoleContext->old_command[pConsoleContext->old_idx]))
          {
-            strncpy (pConsoleContext->arg,
+            cpe_control_strncpy_s(pConsoleContext->arg,
+                    DSL_MAX_COMMAND_LINE_LENGTH,
                     pConsoleContext->old_command[pConsoleContext->old_idx],
-                    DSL_MAX_COMMAND_LINE_LENGTH);
+                    strlen(pConsoleContext->old_command[pConsoleContext->old_idx]));
 
             goto ARROW_KEY;
          }
@@ -457,9 +460,10 @@ DSL_Error_t DSL_CPE_Handle_Console (DSL_CPE_Console_Context_t * pConsoleContext)
             if (pConsoleContext->old_idx >= MAX_OLD_COMMAND)
                pConsoleContext->old_idx = 0;
 
-            strncpy (pConsoleContext->arg,
+            cpe_control_strncpy_s(pConsoleContext->arg,
+                    DSL_MAX_COMMAND_LINE_LENGTH,
                     pConsoleContext->old_command[pConsoleContext->old_idx],
-                    DSL_MAX_COMMAND_LINE_LENGTH);
+                    strlen(pConsoleContext->old_command[pConsoleContext->old_idx]));
 
 
             goto ARROW_KEY;
@@ -518,8 +522,9 @@ DSL_Error_t DSL_CPE_Handle_Console (DSL_CPE_Console_Context_t * pConsoleContext)
           (pConsoleContext->old_command[pConsoleContext->prev_idx],
            pConsoleContext->arg) != 0)
       {
-         strcpy (pConsoleContext->old_command[pConsoleContext->idx],
-                 pConsoleContext->arg);
+         cpe_control_strncpy_s(pConsoleContext->old_command[pConsoleContext->idx],
+            sizeof(pConsoleContext->old_command[pConsoleContext->idx]),
+            pConsoleContext->arg, sizeof(pConsoleContext->arg));
          pConsoleContext->prev_idx = pConsoleContext->idx;
          if (++pConsoleContext->idx >= MAX_OLD_COMMAND)
             pConsoleContext->idx = 0;
@@ -567,7 +572,7 @@ DSL_Error_t DSL_CPE_Handle_Command (char *cmd)
    }
    fd = pConsoleContext->fd;
 
-   strcpy(gv_pConsoleContext->arg, cmd);
+   cpe_control_strncpy_s(gv_pConsoleContext->arg, sizeof(gv_pConsoleContext->arg), cmd, sizeof(gv_pConsoleContext->arg));
 
    /* get command name */
    sscanf (pConsoleContext->arg, "%s", pConsoleContext->cmd);
@@ -576,7 +581,7 @@ DSL_Error_t DSL_CPE_Handle_Command (char *cmd)
 
    if (len)
    {
-       strcpy(pConsoleContext->arg, cmd);
+       cpe_control_strncpy_s(pConsoleContext->arg, sizeof(pConsoleContext->arg), cmd, sizeof(pConsoleContext->arg));
    }
 
    /* find function by name and execute it */
@@ -609,7 +614,7 @@ void rtems_DSL_CPE_Handle_Console(char *cmd)
       return DSL_ERROR;
     }
 
-    strcpy(gv_pConsoleContext->arg, cmd);
+    cpe_control_strncpy_s(gv_pConsoleContext->arg, sizeof(gv_pConsoleContext->arg), cmd, sizeof(gv_pConsoleContext->arg));
     // DSL_CPE_Handle_Console (gv_pConsoleContext);
     gv_dsl_cli_wait=1;
 }
diff --git a/src/dsl_cpe_cli_pipe.c b/src/dsl_cpe_cli_pipe.c
index 1ffed13f229a000121f7bcd771b64b0f2c844d1e..0951212883428cbf8820b9c5444b7222edeac262 100644
--- a/src/dsl_cpe_cli_pipe.c
+++ b/src/dsl_cpe_cli_pipe.c
@@ -107,7 +107,7 @@ DSL_Error_t DSL_CPE_Pipe_CreateCliEntry(DSL_CPE_Control_Context_t *pContext,
                                 DSL_int_t                  nPipeNum)
 {
    DSL_Error_t ret = DSL_SUCCESS;
-   DSL_char_t Name[16];
+   DSL_char_t Name[32];
    
    memset(pPipeEnv, 0, sizeof(Pipe_env_t));
 
diff --git a/src/dsl_cpe_cli_vrx.c b/src/dsl_cpe_cli_vrx.c
index bd614947bdfab1d9dc1e343b3e8613e2c0ea150f..27c0522a4169a2d916ce142e1214ce73a8630d1f 100644
--- a/src/dsl_cpe_cli_vrx.c
+++ b/src/dsl_cpe_cli_vrx.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -623,7 +625,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_AutobootLoadFirmware(
             g_sFirmwareName1 = DSL_CPE_Malloc (strlen (pcFw) + 1);
             if (g_sFirmwareName1)
             {
-               strcpy (g_sFirmwareName1, pcFw);
+               memset(g_sFirmwareName1, 0, strlen (pcFw) + 1);
+               cpe_control_strncpy_s(g_sFirmwareName1, strlen (pcFw) + 1, pcFw, strlen (pcFw));
             }
             DSL_CPE_FwFeaturesGet(g_sFirmwareName1, &g_nFwFeatures1);
          }
@@ -646,7 +649,8 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_AutobootLoadFirmware(
          g_sFirmwareName2 = DSL_CPE_Malloc (strlen (pcFw2) + 1);
          if (g_sFirmwareName2)
          {
-            strcpy (g_sFirmwareName2, pcFw2);
+            memset(g_sFirmwareName2, 0, strlen (pcFw2) + 1);
+            cpe_control_strncpy_s(g_sFirmwareName2, strlen (pcFw2) + 1, pcFw2, strlen (pcFw2));
          }
          DSL_CPE_FwFeaturesGet(g_sFirmwareName2, &g_nFwFeatures2);
       }
@@ -1666,7 +1670,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_DsmConfigGet(
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
@@ -1745,7 +1749,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_DsmConfigSet(
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
@@ -1811,7 +1815,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_DsmStatusGet(
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
@@ -1877,7 +1881,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_DsmStatisticsGet(
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
@@ -1946,7 +1950,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_DsmMacConfigGet(
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
@@ -2026,12 +2030,12 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_DsmMacConfigSet(
    }
    else
    {
-      memcpy (pData.nMacAddress, &macAdr, DSL_MAC_ADDRESS_OCTETS);
+      cpe_control_memcpy_s(pData.nMacAddress, DSL_MAC_ADDRESS_OCTETS, &macAdr, sizeof(macAdr));
    }
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
@@ -2662,7 +2666,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_MEI_PllOffsetConfigGet(
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
@@ -2729,7 +2733,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_MEI_PllOffsetConfigSet(
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
@@ -2857,7 +2861,7 @@ DSL_CLI_LOCAL DSL_int_t DSL_CPE_CLI_DeviceInfoGet(
 
    DSL_CPE_Fd2DevNum(fd, &nDevice);
 
-   sprintf(dev_name, "/dev/mei_cpe/%u", nDevice);
+   snprintf(dev_name, sizeof(dev_name), "/dev/mei_cpe/%u", nDevice);
 
    mei_fd = DSL_CPE_Open(dev_name);
    if (mei_fd <= 0) {
diff --git a/src/dsl_cpe_config.h.in b/src/dsl_cpe_config.h.in
index 03d4276c9818a10d6805fb95684557aba864f73e..4f6ad461431ca0b196bb8241be1619efb7cd46a6 100644
--- a/src/dsl_cpe_config.h.in
+++ b/src/dsl_cpe_config.h.in
@@ -43,6 +43,9 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Define to 1 if you have the <json-c/json.h> header file. */
+#undef HAVE_JSON_C_JSON_H
+
 /* Define to 1 if you have the <limits.h> header file. */
 #undef HAVE_LIMITS_H
 
@@ -55,6 +58,9 @@
 /* Define to 1 if you have the <netinet/in.h> header file. */
 #undef HAVE_NETINET_IN_H
 
+/* Define to 1 if you have the <safe_lib.h> header file. */
+#undef HAVE_SAFE_LIB_H
+
 /* Define to 1 if stdbool.h conforms to C99. */
 #undef HAVE_STDBOOL_H
 
@@ -217,6 +223,9 @@
 /* Include G997 status support */
 #undef INCLUDE_DSL_G997_STATUS
 
+/* Include JSON parsing */
+#undef INCLUDE_DSL_JSON_PARSING
+
 /* Include DSL PM support */
 #undef INCLUDE_DSL_PM
 
@@ -262,6 +271,9 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* Safe-C lib ver3.3 support */
+#undef SAFEC_SUPPORT
+
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
diff --git a/src/dsl_cpe_configuration_parser.c b/src/dsl_cpe_configuration_parser.c
new file mode 100644
index 0000000000000000000000000000000000000000..fc7c4ef4e7205cb33184a65e170f961f39664506
--- /dev/null
+++ b/src/dsl_cpe_configuration_parser.c
@@ -0,0 +1,1939 @@
+/******************************************************************************
+
+         Copyright (c) 2018 - 2019 Intel Corporation
+
+  For licensing information, see the file 'LICENSE' in the root folder of
+  this software module.
+
+*******************************************************************************/
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+
+#include "json.h"
+#include "dsl_cpe_control.h"
+#include "dsl_cpe_configuration_parser.h"
+
+#include "drv_dsl_cpe_api_ioctl.h"
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+/* MEI CPE driver specific header (e.g. IOCtls) */
+#include "drv_mei_cpe_interface.h"
+#endif /* defined(INCLUDE_DSL_CPE_API_VRX) */
+
+#undef DSL_CCA_DBG_BLOCK
+#define DSL_CCA_DBG_BLOCK DSL_CCA_DBG_APP
+
+#define CONFIG_ROOT_NAME "Root"
+#define CONFIG_SECTION_PATH_SEPARATOR "."
+
+/* DSL sections */
+#define CONFIG_DSL_SECTION_PATH \
+   CONFIG_ROOT_NAME CONFIG_SECTION_PATH_SEPARATOR "dsl"
+
+#define CONFIG_DEBUGGING_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "debugging"
+
+#define CONFIG_STARTUPINIT_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "startup_init"
+
+#define CONFIG_BITSWAP_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "bitswap"
+
+#define CONFIG_RETRANSMISSION_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "retransmission"
+
+#define CONFIG_SRA_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "sra"
+
+#define CONFIG_VIRTUALNOISE_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "virtual_noise"
+
+#define CONFIG_REBOOTCRITERIA_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "reboot_criteria"
+
+#define CONFIG_XTSE_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "xtse"
+
+#define CONFIG_TCLAYER_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "tc_layer"
+
+#define CONFIG_COMMON_SECTION_PATH \
+   CONFIG_DSL_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "common"
+
+/* DSL Common subsections */
+#define CONFIG_LOWLEVELHSTONES_SECTION_PATH \
+   CONFIG_COMMON_SECTION_PATH CONFIG_SECTION_PATH_SEPARATOR "low_level_hs_tones"
+
+#define CONFIGURATION_VALUE_UNDEFINED 0x7FFFFFFF
+
+#define PARSE_SECTION_INT(Section, ParameterName, ConfigField) \
+   do { \
+      if (bFound == DSL_FALSE && \
+          strstr(pSectionPath, Section CONFIG_SECTION_PATH_SEPARATOR ParameterName) \
+         != NULL) \
+      { \
+         ConfigField = nIntVal; \
+         bFound = DSL_TRUE; \
+      } \
+   } \
+   while(0)
+
+#define PARSE_SECTION_STRING(Section, ParameterName, ConfigField) \
+   do { \
+      if (bFound == DSL_FALSE && \
+          strstr(pSectionPath, Section CONFIG_SECTION_PATH_SEPARATOR ParameterName) \
+         != NULL) \
+      { \
+         cpe_control_strncpy_s( \
+            ConfigField, sizeof(ConfigField), nStringVal, sizeof(nStringVal)); \
+         bFound = DSL_TRUE; \
+      } \
+   } \
+   while(0)
+
+#define PARSE_SECTION_HEX(Section, ParameterName, ConfigField) \
+   do { \
+      if (bFound == DSL_FALSE && \
+          strstr(pSectionPath, Section CONFIG_SECTION_PATH_SEPARATOR ParameterName) \
+         != NULL) \
+      { \
+         ConfigField = (DSL_uint32_t)(strtol(nStringVal, NULL, 16)); \
+         bFound = DSL_TRUE; \
+      } \
+   } \
+   while(0)
+
+/* Macro used to check if configuration parameter is in valid range */
+#define CONFIG_PARAM_RANGE_VALIDATION(Param, nMinVal, nMaxVal) \
+   do { \
+      int val = Param; \
+      if (val == CONFIGURATION_VALUE_UNDEFINED) \
+      { \
+            break; \
+      } \
+      if ((val > nMaxVal) || (val < nMinVal)) \
+      { \
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, \
+            (DSL_CPE_PREFIX"ERROR - Configuration param %s " \
+            "validation failed! (min = %d, max = %d, current = %d)!" \
+            DSL_CPE_CRLF, #Param, nMinVal, nMaxVal, val)); \
+         return DSL_ERROR; \
+      } \
+   } \
+   while(0)
+
+/* Macro used to check if parameter in DSL_CPE_Configuration_t (configParam)
+is undefined, if so use currentParam (from DSL_xxxGet function or any other source) */
+#define CONFIG_PARAM_APPLY(currentParam, configParam) \
+   do { \
+      currentParam = (configParam == CONFIGURATION_VALUE_UNDEFINED) ? currentParam : configParam; \
+   } \
+   while(0)
+
+#define SECTION_PATH_LENGTH 256
+
+/* Configuration file path */
+static const char *g_pJsonConfigPath = "/opt/intel/etc/dsl_cpe_control.conf";
+static DSL_Configuration_t g_sConfiguration = { 0 };
+
+/**********************************************/
+/* start local function declarations          */
+/**********************************************/
+
+static DSL_Error_t DSL_CPE_JsonParseConfigFile(
+   const DSL_char_t * pPath,
+   DSL_Configuration_t *pData
+);
+
+static DSL_void_t DSL_CPE_JsonReadObj(
+   json_object * pObj,
+   DSL_char_t * pSectionPath,
+   DSL_Configuration_t *pData
+);
+
+static DSL_void_t DSL_CPE_JsonParse(
+   json_object * pObj,
+   DSL_char_t * pSectionPath,
+   DSL_Configuration_t *pData
+);
+
+static DSL_void_t DSL_CPE_JsonParseArray(
+   json_object * pObj,
+   DSL_char_t * pKey,
+   DSL_char_t * pSectionPath,
+   DSL_Configuration_t *pData
+);
+
+static DSL_Error_t DSL_CPE_ConfigRead();
+
+static DSL_Error_t DSL_CPE_ConfigValidateAndApply(
+   DSL_CPE_Control_Context_t *pCtrlCtx
+);
+
+static DSL_Error_t DSL_CPE_LowLevelCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_LineFeatureCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_RebootCriteriaCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_VdslProfileCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_G997_RateAdaptationCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_SysIfCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_XtseCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_VectoringEnableCfgApply(
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_FwMessagePollingCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+static DSL_Error_t DSL_CPE_OperatorSelectCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum
+);
+
+/**********************************************/
+/* start interface function definitions       */
+/**********************************************/
+
+/*
+   For a detailed description of the function, its arguments and return value
+   please refer to the description in the header file 'dsl_cpe_configuration_parser.h'
+*/
+DSL_Error_t DSL_CPE_ConfigInit()
+{
+   static DSL_boolean_t bInitDone = DSL_FALSE;
+
+   if (bInitDone == DSL_FALSE)
+   {
+      if (DSL_CPE_ConfigRead() == DSL_ERROR)
+      {
+         /* keep default configuration just awhile
+            to reduce memory consumption */
+         DSL_ConfigurationData_t sDefaultConfigData =
+         {
+            /* DSL_CFG_Debugging_t */
+            { 1 },
+
+            /* DSL_CFG_StartupInit_t */
+            { 0, 1, 1, 1 },
+
+            /* DSL_CFG_Bitswap_t */
+            { 1, 1, 1, 1 },
+
+            /* DSL_CFG_Retransmission_t */
+            { 0, 0, 1, 1 },
+
+            /* DSL_CFG_Sra_t */
+            { 0, 0, 1, 1 },
+
+            /* DSL_CFG_VirtualNoise_t */
+            { 1, 1 },
+
+            /* DSL_CFG_RebootCriteria_t */
+            { 0x4F, 0xF },
+
+            /* DSL_CFG_SystemInterface_t */
+            { 0, 0 },
+
+            /* DSL_CFG_Common_t */
+            {
+               /* OperatorSelect */
+               0,
+
+               /* LdAfeShutdown */
+               1,
+
+               /* VectoringEnable */
+               0,
+
+               /* VdslProfileVal */
+               0x1FF,
+
+               /* ActSeq */
+               1,
+
+               /* ActMode */
+               1,
+
+               /* Remember */
+               0,
+
+               /* FWMsgPollingOnly */
+               0,
+
+               /* DSL_CFG_LowLevelHsTones_t */
+               { 0, 0 }
+            },
+
+            /* xtse */
+            { 0x4, 0x0, 0x4, 0x0, 0xC, 0x1, 0x0, 0x7 }
+         };
+         DSL_Configuration_t sDefaultConfig = { 0 };
+
+         cpe_control_memcpy_s(
+            &(sDefaultConfig.data), sizeof(DSL_ConfigurationData_t),
+            &sDefaultConfigData, sizeof(DSL_ConfigurationData_t));
+
+         cpe_control_memcpy_s(
+            &g_sConfiguration, sizeof(DSL_Configuration_t),
+            &sDefaultConfig, sizeof(DSL_Configuration_t));
+
+         DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+            "WARNING - Configuration initialized with default values!" DSL_CPE_CRLF));
+      }
+      bInitDone = DSL_TRUE;
+
+      return DSL_TRUE;
+   }
+   else
+   {
+      return DSL_FALSE;
+   }
+}
+
+/*
+   For a detailed description of the function, its arguments and return value
+   please refer to the description in the header file 'dsl_cpe_configuration_parser.h'
+*/
+DSL_Error_t DSL_CPE_ConfigGet(const DSL_Configuration_t **pConfiguration)
+{
+   *pConfiguration = &g_sConfiguration;
+
+   return DSL_SUCCESS;
+}
+
+/*
+   For a detailed description of the function, its arguments and return value
+   please refer to the description in the header file 'dsl_cpe_configuration_parser.h'
+*/
+DSL_Error_t DSL_CPE_ConfigUpdate(
+   DSL_CPE_Control_Context_t *pCtrlCtx)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   static DSL_boolean_t bReconfig = DSL_FALSE;
+
+   /* on init, ConfigRead is already called in ConfigInit function -
+      no need to call it again */
+   if (bReconfig == DSL_TRUE)
+   {
+      nRet = DSL_CPE_ConfigRead();
+   }
+
+   /* do not proceed when ConfigRead failed with undefined values */
+   if (nRet == DSL_SUCCESS)
+   {
+      nRet = DSL_CPE_ConfigValidateAndApply(pCtrlCtx);
+   }
+
+   bReconfig = DSL_TRUE;
+
+   return nRet;
+}
+
+/*********************************************/
+/* start local function definitions          */
+/*********************************************/
+
+static DSL_Error_t DSL_CPE_JsonParseConfigFile(
+   const DSL_char_t * pPath,
+   DSL_Configuration_t *pData)
+{
+   DSL_CPE_File_t *pFile = DSL_NULL;
+   DSL_int_t nFileLength = 0;
+   DSL_char_t * pBuffer = DSL_NULL;
+   DSL_char_t currentSectionPath[SECTION_PATH_LENGTH] = { CONFIG_ROOT_NAME };
+
+   json_object * pRootObj = DSL_NULL;
+
+   pFile = DSL_CPE_FOpen(pPath, "r");
+   if (pFile == DSL_NULL)
+   {
+      return DSL_ERROR;
+   }
+
+   /* Get length of file as JSON has strict format
+   and we have to read whole file at once */
+   fseek(pFile, 0, SEEK_END);
+   nFileLength = ftell(pFile);
+   fseek(pFile, 0, SEEK_SET);
+
+   /* Alloc buffer for JSON file content */
+   pBuffer = (DSL_char_t *)DSL_CPE_Malloc(nFileLength * sizeof(DSL_char_t));
+   if (pBuffer == DSL_NULL)
+   {
+      DSL_CPE_FClose(pFile);
+      return DSL_ERROR;
+   }
+
+   /* Read file */
+   DSL_CPE_FRead(pBuffer, sizeof(DSL_char_t), nFileLength, pFile);
+   DSL_CPE_FClose(pFile);
+
+   /* Create JSON Object from string */
+   pRootObj = json_tokener_parse(pBuffer);
+   DSL_CPE_Free(pBuffer);
+
+   if (pRootObj == DSL_NULL)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+         "Configuration Parser: invalid JSON file syntax" DSL_CPE_CRLF));
+      return DSL_ERROR;
+   }
+
+   /* Start parsing */
+   DSL_CPE_JsonReadObj(pRootObj, currentSectionPath, pData);
+
+   return DSL_SUCCESS;
+}
+
+static DSL_void_t DSL_CPE_JsonReadObj(
+   json_object * pObj,
+   DSL_char_t *pSectionPath,
+   DSL_Configuration_t *pData)
+{
+   enum json_type nType = json_type_null;
+   DSL_char_t currentSectionPath[SECTION_PATH_LENGTH];
+   json_object *pTmpObj = DSL_NULL;
+
+   json_object_object_foreach(pObj, key, val)
+   {
+      pTmpObj = pObj;
+      DSL_CPE_snprintf(currentSectionPath,
+         sizeof(currentSectionPath), "%s.%s", pSectionPath, key);
+
+      nType = json_object_get_type(val);
+
+      switch (nType)
+      {
+      case json_type_array:
+         DSL_CPE_JsonParseArray(pTmpObj, key, currentSectionPath, pData);
+         break;
+      case json_type_object:
+         json_object_object_get_ex(pTmpObj, key, &pTmpObj);
+
+         if (pTmpObj != DSL_NULL)
+         {
+            DSL_CPE_JsonReadObj(pTmpObj, currentSectionPath, pData);
+         }
+         break;
+      case json_type_null:
+      case json_type_boolean:
+      case json_type_double:
+      case json_type_int:
+      case json_type_string:
+         DSL_CPE_JsonParse(val, currentSectionPath, pData);
+         break;
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonParse(
+   json_object * pObj,
+   DSL_char_t * pSectionPath,
+   DSL_Configuration_t *pData)
+{
+   enum json_type nType = json_type_null;
+   DSL_int_t nIntVal = 0;
+   DSL_char_t nStringVal[64] = { 0 };
+   DSL_boolean_t bFound = DSL_FALSE;
+
+   DSL_CFG_Debugging_t *pDebuggingConfig = &pData->data.sDebuggingConfig;
+   DSL_CFG_StartupInit_t *pStartupInitConfig = &pData->data.sStartupInitConfig;
+   DSL_CFG_Bitswap_t *pBitswapConfig = &pData->data.sBitswapConfig;
+   DSL_CFG_Common_t *pCommonConfig = &pData->data.sCommonConfig;
+   DSL_CFG_Retransmission_t *pRetransmissionConfig =
+      &pData->data.sRetransmissionConfig;
+   DSL_CFG_Sra_t *pSraConfig = &pData->data.sSraConfig;
+   DSL_CFG_VirtualNoise_t *pVirtualNoiseConfig =
+      &pData->data.sVirtualNoiseConfig;
+   DSL_CFG_RebootCriteria_t *pRebootCriteriaConfig =
+      &pData->data.sRebootCriteriaConfig;
+   DSL_CFG_SystemInterface_t *pSystemIfConfig =
+      &pData->data.sSystemIfConfig;
+
+   /* We are only interested in Root.DSL section */
+   if (strstr(pSectionPath, CONFIG_DSL_SECTION_PATH) == DSL_NULL)
+   {
+      return;
+   }
+
+   nType = json_object_get_type(pObj);
+
+   switch (nType)
+   {
+      case json_type_boolean:
+      case json_type_int:
+         nIntVal = (DSL_int_t)json_object_get_int(pObj);
+
+         DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+            "Configuration Parser: %s: %d" DSL_CPE_CRLF,
+            pSectionPath, nIntVal));
+
+         /* Debugging */
+         PARSE_SECTION_INT(
+            CONFIG_DEBUGGING_SECTION_PATH, "debug_and_test_interfaces", pDebuggingConfig->nDebugAndTestInterfaces);
+
+         /* StartupInit */
+         PARSE_SECTION_INT(
+            CONFIG_STARTUPINIT_SECTION_PATH, "next_mode", pStartupInitConfig->nNextMode);
+         PARSE_SECTION_INT(
+            CONFIG_STARTUPINIT_SECTION_PATH, "max_device_number", pStartupInitConfig->nMaxDeviceNumber);
+         PARSE_SECTION_INT(
+            CONFIG_STARTUPINIT_SECTION_PATH, "lines_per_device", pStartupInitConfig->nLinesPerDevice);
+         PARSE_SECTION_INT(
+            CONFIG_STARTUPINIT_SECTION_PATH, "channels_per_line", pStartupInitConfig->nChannelsPerLine);
+
+         /* Bitswap */
+         PARSE_SECTION_INT(
+            CONFIG_BITSWAP_SECTION_PATH, "vdsl_us", pBitswapConfig->Us_Vdsl);
+         PARSE_SECTION_INT(
+            CONFIG_BITSWAP_SECTION_PATH, "vdsl_ds", pBitswapConfig->Ds_Vdsl);
+         PARSE_SECTION_INT(
+            CONFIG_BITSWAP_SECTION_PATH, "adsl_us", pBitswapConfig->Us_Adsl);
+         PARSE_SECTION_INT(
+            CONFIG_BITSWAP_SECTION_PATH, "adsl_ds", pBitswapConfig->Ds_Adsl);
+
+         /* Retransmission */
+         PARSE_SECTION_INT(
+            CONFIG_RETRANSMISSION_SECTION_PATH, "vdsl_us", pRetransmissionConfig->Us_Vdsl);
+         PARSE_SECTION_INT(
+            CONFIG_RETRANSMISSION_SECTION_PATH, "vdsl_ds", pRetransmissionConfig->Ds_Vdsl);
+         PARSE_SECTION_INT(
+            CONFIG_RETRANSMISSION_SECTION_PATH, "adsl_us", pRetransmissionConfig->Us_Adsl);
+         PARSE_SECTION_INT(
+            CONFIG_RETRANSMISSION_SECTION_PATH, "adsl_ds", pRetransmissionConfig->Ds_Adsl);
+
+         /* SRA */
+         PARSE_SECTION_INT(
+            CONFIG_SRA_SECTION_PATH, "vdsl_us", pSraConfig->Us_Vdsl);
+         PARSE_SECTION_INT(
+            CONFIG_SRA_SECTION_PATH, "vdsl_ds", pSraConfig->Ds_Vdsl);
+         PARSE_SECTION_INT(
+            CONFIG_SRA_SECTION_PATH, "adsl_us", pSraConfig->Us_Adsl);
+         PARSE_SECTION_INT(
+            CONFIG_SRA_SECTION_PATH, "adsl_ds", pSraConfig->Ds_Adsl);
+
+         /* Virtualnoise */
+         PARSE_SECTION_INT(
+            CONFIG_VIRTUALNOISE_SECTION_PATH, "us", pVirtualNoiseConfig->Us);
+         PARSE_SECTION_INT(
+            CONFIG_VIRTUALNOISE_SECTION_PATH, "ds", pVirtualNoiseConfig->Ds);
+
+         /* TcLayer */
+         PARSE_SECTION_INT(
+            CONFIG_TCLAYER_SECTION_PATH, "adsl", pSystemIfConfig->nTcLayer_Adsl);
+         PARSE_SECTION_INT(
+            CONFIG_TCLAYER_SECTION_PATH, "vdsl", pSystemIfConfig->nTcLayer_Vdsl);
+
+         /* Common */
+         PARSE_SECTION_INT(
+            CONFIG_COMMON_SECTION_PATH, "operator_select", pCommonConfig->nOperatorSelect);
+         PARSE_SECTION_INT(
+            CONFIG_COMMON_SECTION_PATH, "ld_afe_shutdown", pCommonConfig->LdAfeShutdown);
+         PARSE_SECTION_INT(
+            CONFIG_COMMON_SECTION_PATH, "vectoring_enable", pCommonConfig->VectoringEnable);
+         PARSE_SECTION_INT(
+            CONFIG_COMMON_SECTION_PATH, "activation_sequence", pCommonConfig->ActSeq);
+         PARSE_SECTION_INT(
+            CONFIG_COMMON_SECTION_PATH, "activation_mode", pCommonConfig->ActMode);
+         PARSE_SECTION_INT(
+            CONFIG_COMMON_SECTION_PATH, "remember", pCommonConfig->Remember);
+         PARSE_SECTION_INT(
+            CONFIG_COMMON_SECTION_PATH, "fw_msg_polling_only", pCommonConfig->FWMsgPollingOnly);
+
+         if (bFound == DSL_FALSE)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+               "Configuration Parser: Unknown parameter %s" DSL_CPE_CRLF,
+               pSectionPath));
+         }
+         break;
+      case json_type_string:
+         DSL_CPE_snprintf(nStringVal, sizeof(nStringVal), "%s",
+            json_object_get_string(pObj));
+         DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+            "Configuration Parser: %s: %s" DSL_CPE_CRLF, pSectionPath, nStringVal));
+
+         /* Reboot criteria */
+         PARSE_SECTION_HEX(
+            CONFIG_REBOOTCRITERIA_SECTION_PATH, "adsl", pRebootCriteriaConfig->Adsl);
+         PARSE_SECTION_HEX(
+            CONFIG_REBOOTCRITERIA_SECTION_PATH, "vdsl", pRebootCriteriaConfig->Vdsl);
+
+         /* Common */
+         PARSE_SECTION_HEX(
+            CONFIG_COMMON_SECTION_PATH, "vdsl_profile", pCommonConfig->VdslProfileVal);
+         PARSE_SECTION_HEX(
+            CONFIG_LOWLEVELHSTONES_SECTION_PATH, "adsl", pCommonConfig->sLowLevelHsTonesConfig.Adsl);
+         PARSE_SECTION_HEX(
+            CONFIG_LOWLEVELHSTONES_SECTION_PATH, "vdsl", pCommonConfig->sLowLevelHsTonesConfig.Vdsl);
+
+         if (bFound == DSL_FALSE)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+               "Configuration Parser: Unknown parameter %s" DSL_CPE_CRLF,
+               pSectionPath));
+         }
+         break;
+      default:
+         break;
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonParseArray(
+   json_object * pObj,
+   DSL_char_t * pKey,
+   DSL_char_t * pSectionPath,
+   DSL_Configuration_t *pData)
+{
+   enum json_type nType = json_type_null;
+   json_object * pArrayObj = pObj;
+   json_object * pValue = DSL_NULL;
+   DSL_char_t currentSectionPath[SECTION_PATH_LENGTH];
+   DSL_int_t nArrayLength = 0;
+   DSL_char_t nStringVal[64] = { 0 };
+   unsigned char *pG997XtuVal = pData->data.G997XtuVal;
+   DSL_boolean_t bFound = DSL_FALSE;
+
+   if (pKey != DSL_NULL)
+   {
+      json_object_object_get_ex(pObj, pKey, &pArrayObj);
+   }
+
+   nArrayLength = json_object_array_length(pArrayObj);
+
+   for (DSL_int_t i = 0; i < nArrayLength; i++)
+   {
+      DSL_CPE_snprintf(currentSectionPath,
+         sizeof(currentSectionPath), "%s[%d]", pSectionPath, i);
+
+      pValue = json_object_array_get_idx(pArrayObj, i);
+      nType = json_object_get_type(pValue);
+
+      bFound = DSL_FALSE;
+
+      switch (nType)
+      {
+      case json_type_array:
+         DSL_CPE_JsonParseArray(pValue, DSL_NULL, currentSectionPath, pData);
+         break;
+      case json_type_object:
+         DSL_CPE_JsonReadObj(pValue, currentSectionPath, pData);
+         break;
+      case json_type_string:
+         DSL_CPE_snprintf(nStringVal, sizeof(nStringVal), "%s",
+            json_object_get_string(pValue));
+
+         /* XTSE */
+         if (strstr(pSectionPath, CONFIG_XTSE_SECTION_PATH) != DSL_NULL)
+         {
+            if (i >= DSL_G997_NUM_XTSE_OCTETS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+                  "Configuration Array Parser: XTSE, index out of range (%d)"
+                  DSL_CPE_CRLF, i));
+               break;
+            }
+            PARSE_SECTION_HEX(CONFIG_DSL_SECTION_PATH, "xtse",
+               pG997XtuVal[i]);
+         }
+         break;
+      case json_type_null:
+      case json_type_boolean:
+      case json_type_double:
+      case json_type_int:
+      default:
+         break;
+      }
+   }
+}
+
+/**
+   Read configuration from the config file
+*/
+static DSL_Error_t DSL_CPE_ConfigRead()
+{
+   DSL_ConfigurationData_t sUndefinedConfigData =
+   {
+      /* DSL_CFG_Debugging_t */
+      {
+         CONFIGURATION_VALUE_UNDEFINED
+      },
+
+      /* DSL_CFG_StartupInit_t */
+      {
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED
+      },
+
+      /* DSL_CFG_Bitswap_t */
+      {
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED
+      },
+
+      /* DSL_CFG_Retransmission_t */
+      {
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED
+      },
+
+      /* DSL_CFG_Sra_t */
+      {
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED
+      },
+
+      /* DSL_CFG_VirtualNoise_t */
+      {
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED
+      },
+
+      /* DSL_CFG_RebootCriteria_t */
+      {
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED
+      },
+
+      /* DSL_CFG_SystemInterface_t */
+      {
+         CONFIGURATION_VALUE_UNDEFINED,
+         CONFIGURATION_VALUE_UNDEFINED
+      },
+
+      /* DSL_CFG_Common_t */
+      {
+         /* operator_select */
+         CONFIGURATION_VALUE_UNDEFINED,
+
+         /* ld_afe_shutdown */
+         CONFIGURATION_VALUE_UNDEFINED,
+
+         /* vectoring_enable */
+         CONFIGURATION_VALUE_UNDEFINED,
+
+         /* vdsl_profile */
+         CONFIGURATION_VALUE_UNDEFINED,
+
+         /* activation_sequence */
+         CONFIGURATION_VALUE_UNDEFINED,
+
+         /* activation_mode */
+         CONFIGURATION_VALUE_UNDEFINED,
+
+         /* remember */
+         CONFIGURATION_VALUE_UNDEFINED,
+
+         /* fw_msg_polling_only */
+         CONFIGURATION_VALUE_UNDEFINED,
+
+         /* low_level_hs_tones */
+         {
+            CONFIGURATION_VALUE_UNDEFINED,
+            CONFIGURATION_VALUE_UNDEFINED
+         }
+      },
+
+      /* xtse */
+      ""
+   };
+
+   cpe_control_memcpy_s(
+      &(g_sConfiguration.data), sizeof(DSL_ConfigurationData_t),
+      &sUndefinedConfigData, sizeof(DSL_ConfigurationData_t));
+
+   if (DSL_CPE_JsonParseConfigFile(g_pJsonConfigPath, &g_sConfiguration) == DSL_ERROR)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - Parsing configuration file failed!" DSL_CPE_CRLF));
+
+      return DSL_ERROR;
+   }
+
+   return DSL_SUCCESS;
+}
+
+/**
+   Execute config update
+*/
+static DSL_Error_t DSL_CPE_ConfigValidateAndApply(
+   DSL_CPE_Control_Context_t *pCtrlCtx)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrCode = DSL_SUCCESS;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_ConfigValidateAndApply" DSL_CPE_CRLF));
+
+   if (pCtrlCtx == DSL_NULL)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - Invalid context pointer!" DSL_CPE_CRLF));
+      return DSL_ERROR;
+   }
+
+   for (int nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; ++nDevice)
+   {
+      nRet = DSL_CPE_LowLevelCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+
+      nRet = DSL_CPE_LineFeatureCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+
+      nRet = DSL_CPE_RebootCriteriaCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+
+      nRet = DSL_CPE_VdslProfileCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+
+      nRet = DSL_CPE_G997_RateAdaptationCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+
+      nRet = DSL_CPE_SysIfCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+
+      nRet = DSL_CPE_XtseCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+      nRet = DSL_CPE_VectoringEnableCfgApply(nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+#endif
+
+      nRet = DSL_CPE_FwMessagePollingCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+
+      nRet = DSL_CPE_OperatorSelectCfgValidateAndApply(pCtrlCtx, nDevice);
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+      }
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_ConfigValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   This function validates and applies device LowLevel configuration
+   taken from the config file
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_LowLevelCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_LowLevelConfiguration_t sLowLevelCfg = { 0 };
+   DSL_CFG_LowLevelHsTones_t sCFGLowLevelHsTones;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_LowLevelCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   sCFGLowLevelHsTones = g_sConfiguration.data.sCommonConfig.sLowLevelHsTonesConfig;
+
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGLowLevelHsTones.Adsl,
+      DSL_DEV_HS_TONE_GROUP_CLEANED,
+      DSL_DEV_HS_TONE_GROUP_ADSL2_A43C);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGLowLevelHsTones.Vdsl,
+      DSL_DEV_HS_TONE_GROUP_CLEANED,
+      DSL_DEV_HS_TONE_GROUP_ADSL2_A43C);
+
+   if (sCFGLowLevelHsTones.Adsl == DSL_DEV_HS_TONE_GROUP_CLEANED &&
+       sCFGLowLevelHsTones.Vdsl == DSL_DEV_HS_TONE_GROUP_CLEANED)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+         "API default handshake tones will be used." DSL_CPE_CRLF));
+
+      return nErrCode;
+   }
+
+   nErrCode = DSL_CPE_Ioctl(
+                  pControlContext->fd[nDevNum],
+                  DSL_FIO_LOW_LEVEL_CONFIGURATION_GET,
+                  (int) &sLowLevelCfg);
+
+   if (nErrCode == DSL_SUCCESS)
+   {
+      if (sCFGLowLevelHsTones.Adsl > DSL_DEV_HS_TONE_GROUP_CLEANED ||
+         sCFGLowLevelHsTones.Vdsl > DSL_DEV_HS_TONE_GROUP_CLEANED)
+      {
+         CONFIG_PARAM_APPLY(
+            sLowLevelCfg.data.nHsToneGroupMode,
+            DSL_DEV_HS_TONE_GROUP_MODE_MANUAL);
+         CONFIG_PARAM_APPLY(
+            sLowLevelCfg.data.nHsToneGroup_AV,
+            DSL_DEV_HS_TONE_GROUP_CLEANED);
+      }
+      else
+      {
+         CONFIG_PARAM_APPLY(
+            sLowLevelCfg.data.nHsToneGroupMode,
+            DSL_DEV_HS_TONE_GROUP_MODE_AUTO);
+      }
+
+      if (sCFGLowLevelHsTones.Adsl > DSL_DEV_HS_TONE_GROUP_CLEANED)
+      {
+         CONFIG_PARAM_APPLY(
+            sLowLevelCfg.data.nHsToneGroup_A,
+            sCFGLowLevelHsTones.Adsl);
+      }
+      if (sCFGLowLevelHsTones.Vdsl > DSL_DEV_HS_TONE_GROUP_CLEANED)
+      {
+         CONFIG_PARAM_APPLY(
+            sLowLevelCfg.data.nHsToneGroup_V,
+            sCFGLowLevelHsTones.Vdsl);
+      }
+
+      nErrCode = DSL_CPE_Ioctl(
+                     pControlContext->fd[nDevNum],
+                     DSL_FIO_LOW_LEVEL_CONFIGURATION_SET,
+                     (int) &sLowLevelCfg);
+
+      if (nErrCode != DSL_SUCCESS)
+      {
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+            "ERROR - DSL_FIO_LOW_LEVEL_CONFIGURATION_SET ioctl failed, "
+            "error=%d!" DSL_CPE_CRLF,
+            nErrCode));
+      }
+   }
+   else
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_LOW_LEVEL_CONFIGURATION_GET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nErrCode));
+   }
+
+   /* on failure print additional debug info */
+   if (sLowLevelCfg.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - DSL_FIO_LOW_LEVEL_CONFIGURATION "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sLowLevelCfg.accessCtl.nReturn));
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_LowLevelCfgValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   This function validates and applies LineFeature configuration
+   taken from the config file
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_LineFeatureCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrCode = DSL_SUCCESS;
+   DSL_LineFeature_t sLineFeature = { 0 };
+   DSL_CFG_Bitswap_t sCFGBitswap;
+   DSL_CFG_Retransmission_t sCFGRetransmission;
+   DSL_CFG_VirtualNoise_t sCFGVirtualNoise;
+   DSL_DslModeSelection_t dslMode = DSL_MODE_NA;
+   DSL_AccessDir_t accessDir = DSL_ACCESSDIR_NA;
+   /* Configuration of retransmission setting:
+         0: Disable retransmission
+         1: Enable retransmission
+         2: Use API internal default configuration */
+   const DSL_uint8_t CONFIG_MIN_RETX_VAL = 0;
+   const DSL_uint8_t CONFIG_MAX_RETX_VAL = 2;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_LineFeatureCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   sCFGBitswap = g_sConfiguration.data.sBitswapConfig;
+   sCFGRetransmission = g_sConfiguration.data.sRetransmissionConfig;
+   sCFGVirtualNoise = g_sConfiguration.data.sVirtualNoiseConfig;
+
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGRetransmission.Us_Adsl,
+      CONFIG_MIN_RETX_VAL,
+      CONFIG_MAX_RETX_VAL);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGRetransmission.Ds_Adsl,
+      CONFIG_MIN_RETX_VAL,
+      CONFIG_MAX_RETX_VAL);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGRetransmission.Us_Vdsl,
+      CONFIG_MIN_RETX_VAL,
+      CONFIG_MAX_RETX_VAL);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGRetransmission.Ds_Vdsl,
+      CONFIG_MIN_RETX_VAL,
+      CONFIG_MAX_RETX_VAL);
+
+   /* Use API internal default configuration */
+   if (sCFGRetransmission.Us_Adsl == CONFIG_MAX_RETX_VAL)
+      sCFGRetransmission.Us_Adsl = 0;
+
+   if (sCFGRetransmission.Ds_Adsl == CONFIG_MAX_RETX_VAL)
+      sCFGRetransmission.Ds_Adsl = 0;
+
+   if (sCFGRetransmission.Us_Vdsl == CONFIG_MAX_RETX_VAL)
+      sCFGRetransmission.Us_Vdsl = 1;
+
+   if (sCFGRetransmission.Ds_Vdsl == CONFIG_MAX_RETX_VAL)
+      sCFGRetransmission.Ds_Vdsl = 1;
+
+   for (dslMode = DSL_MODE_ADSL; dslMode < DSL_MODE_LAST; ++dslMode)
+   {
+      for (accessDir = DSL_UPSTREAM; accessDir < DSL_ACCESSDIR_LAST; ++accessDir)
+      {
+         memset(&sLineFeature, 0x0, sizeof(DSL_LineFeature_t));
+         sLineFeature.nDslMode = dslMode;
+         sLineFeature.nDirection = accessDir;
+
+         nRet = DSL_CPE_Ioctl(
+                     pControlContext->fd[nDevNum],
+                     DSL_FIO_LINE_FEATURE_CONFIG_GET,
+                     (int) &sLineFeature);
+
+         if (nRet == DSL_SUCCESS)
+         {
+            if (dslMode == DSL_MODE_ADSL)
+            {
+               if (accessDir == DSL_UPSTREAM)
+               {
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bBitswapEnable,
+                     (DSL_int32_t)(sCFGBitswap.Us_Adsl));
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bReTxEnable,
+                     sCFGRetransmission.Us_Adsl);
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bVirtualNoiseSupport,
+                     (DSL_int32_t)(sCFGVirtualNoise.Us));
+               }
+               else
+               {
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bBitswapEnable,
+                     (DSL_int32_t)(sCFGBitswap.Ds_Adsl));
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bReTxEnable,
+                     sCFGRetransmission.Ds_Adsl);
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bVirtualNoiseSupport,
+                     (DSL_int32_t)(sCFGVirtualNoise.Ds));
+               }
+            }
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+            else
+            {
+               if (accessDir == DSL_UPSTREAM)
+               {
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bBitswapEnable,
+                     (DSL_int32_t)(sCFGBitswap.Us_Vdsl));
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bReTxEnable,
+                     sCFGRetransmission.Us_Vdsl);
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bVirtualNoiseSupport,
+                     (DSL_int32_t)(sCFGVirtualNoise.Us));
+               }
+               else
+               {
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bBitswapEnable,
+                     (DSL_int32_t)(sCFGBitswap.Ds_Vdsl));
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bReTxEnable,
+                     sCFGRetransmission.Ds_Vdsl);
+                  CONFIG_PARAM_APPLY(
+                     sLineFeature.data.bVirtualNoiseSupport,
+                     (DSL_int32_t)(sCFGVirtualNoise.Ds));
+               }
+            }
+#endif /* INCLUDE_DSL_CPE_API_VRX */
+
+            nRet = DSL_CPE_Ioctl(
+                        pControlContext->fd[nDevNum],
+                        DSL_FIO_LINE_FEATURE_CONFIG_SET,
+                        (int) &sLineFeature);
+
+            if (nRet != DSL_SUCCESS)
+            {
+               nErrCode = nRet;
+
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                 "ERROR - DSL_FIO_LINE_FEATURE_CONFIG_SET ioctl failed, "
+                  "error=%d!" DSL_CPE_CRLF,
+                  nRet));
+            }
+         }
+         else
+         {
+            nErrCode = nRet;
+
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_LINE_FEATURE_CONFIG_GET ioctl failed, "
+               "error=%d!" DSL_CPE_CRLF,
+               nRet));
+         }
+
+         /* on failure print additional debug info */
+         if (sLineFeature.accessCtl.nReturn)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+               "WARNING - DSL_FIO_LINE_FEATURE_CONFIG "
+               "access control retCode=%d!" DSL_CPE_CRLF,
+               sLineFeature.accessCtl.nReturn));
+         }
+      }
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_LineFeatureCfgValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   This function validates and applies Reboot configuration
+   taken from the config file
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_RebootCriteriaCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrCode = DSL_SUCCESS;
+   DSL_RebootCriteriaConfig_t sRebootCriteriaConfig;
+   DSL_CFG_RebootCriteria_t sCFGRebootCriteria = { 0 };
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_RebootCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   sCFGRebootCriteria = g_sConfiguration.data.sRebootCriteriaConfig;
+
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGRebootCriteria.Adsl,
+      DSL_REBOOT_CRITERIA_CLEANED,
+      DSL_REBOOT_CRITERIA_LCD_BC1);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGRebootCriteria.Vdsl,
+      DSL_REBOOT_CRITERIA_CLEANED,
+      DSL_REBOOT_CRITERIA_LCD_BC1);
+
+   memset(&sRebootCriteriaConfig, 0x0, sizeof(DSL_RebootCriteriaConfig_t));
+   sRebootCriteriaConfig.nDslMode = DSL_MODE_ADSL;
+
+   CONFIG_PARAM_APPLY(
+      sRebootCriteriaConfig.data.nRebootCriteria,
+      sCFGRebootCriteria.Adsl);
+
+   nRet = DSL_CPE_Ioctl(
+               pControlContext->fd[nDevNum],
+               DSL_FIO_REBOOT_CRITERIA_CONFIG_SET,
+               (int) &sRebootCriteriaConfig);
+
+   /* store error code in case of failure */
+   if (nRet != DSL_SUCCESS)
+   {
+      nErrCode = nRet;
+
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_REBOOT_CRITERIA_CONFIG_SET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nRet));
+   }
+
+   /* on failure print additional debug info */
+   if (sRebootCriteriaConfig.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - DSL_FIO_REBOOT_CRITERIA_CONFIG "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sRebootCriteriaConfig.accessCtl.nReturn));
+   }
+
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+   memset(&sRebootCriteriaConfig, 0x0, sizeof(DSL_RebootCriteriaConfig_t));
+   sRebootCriteriaConfig.nDslMode = DSL_MODE_VDSL;
+
+   CONFIG_PARAM_APPLY(
+      sRebootCriteriaConfig.data.nRebootCriteria,
+      sCFGRebootCriteria.Vdsl);
+
+   nRet = DSL_CPE_Ioctl(
+               pControlContext->fd[nDevNum],
+               DSL_FIO_REBOOT_CRITERIA_CONFIG_SET,
+               (int) &sRebootCriteriaConfig);
+
+   /* store error code in case of failure */
+   if (nRet != DSL_SUCCESS)
+   {
+      nErrCode = nRet;
+
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_REBOOT_CRITERIA_CONFIG_SET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nRet));
+   }
+
+   /* on failure print additional debug info */
+   if (sRebootCriteriaConfig.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - DSL_FIO_REBOOT_CRITERIA_CONFIG "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sRebootCriteriaConfig.accessCtl.nReturn));
+   }
+#endif /* INCLUDE_DSL_CPE_API_VRX */
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_RebootCfgValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   This function validates and applies VDSL profile configuration
+   taken from the config file
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_VdslProfileCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_VdslProfileConfig_t sVdslProfile;
+   DSL_uint32_t nCFGVdslProfileVal = 0;
+   const DSL_uint32_t nMaxMask = 0x1FF;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_VdslProfileCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   nCFGVdslProfileVal = g_sConfiguration.data.sCommonConfig.VdslProfileVal;
+
+   /* Use API internal default configuration */
+   if (nCFGVdslProfileVal == 0)
+      nCFGVdslProfileVal = nMaxMask;
+
+   CONFIG_PARAM_RANGE_VALIDATION(
+      nCFGVdslProfileVal,
+      DSL_BF_PROFILE_8A,
+      nMaxMask);
+
+   memset(&sVdslProfile, 0x0, sizeof(DSL_VdslProfileConfig_t));
+
+   CONFIG_PARAM_APPLY(
+      sVdslProfile.data.nVdslProfile,
+      nCFGVdslProfileVal);
+
+   nErrCode = DSL_CPE_Ioctl(
+                  pControlContext->fd[nDevNum],
+                  DSL_FIO_VDSL_PROFILE_CONFIG_SET,
+                  (int) &sVdslProfile);
+
+   /* store error code in case of failure */
+   if (nErrCode != DSL_SUCCESS)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_VDSL_PROFILE_CONFIG_SET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nErrCode));
+   }
+
+   /* on failure print additional debug info */
+   if (sVdslProfile.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "wARNING - DSL_FIO_VDSL_PROFILE_CONFIG "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sVdslProfile.accessCtl.nReturn));
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_VdslProfileCfgValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   This function validates and applies seamless rate adaptation configuration
+   taken from the config file
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_G997_RateAdaptationCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrCode = DSL_SUCCESS;
+   DSL_G997_RateAdaptationConfig_t sg997RA;
+   DSL_CFG_Sra_t sCFGSra;
+   DSL_DslModeSelection_t dslMode = DSL_MODE_NA;
+   DSL_AccessDir_t accessDir = DSL_ACCESSDIR_NA;
+   const DSL_uint8_t g997RAShift = 2;
+   /* Configuration of seamless rate adaptation (SRA):
+         0: Disable SRA
+         1: Enable SRA
+         2: Use API internal default configuration
+            (disabled for ADSL, enabled for VDSL) */
+   const DSL_uint8_t CONFIG_MIN_SRA_VAL = 0;
+   const DSL_uint8_t CONFIG_MAX_SRA_VAL = 2;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_G997_RateAdaptationCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   sCFGSra = g_sConfiguration.data.sSraConfig;
+
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGSra.Us_Adsl,
+      CONFIG_MIN_SRA_VAL,
+      CONFIG_MAX_SRA_VAL);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGSra.Ds_Adsl,
+      CONFIG_MIN_SRA_VAL,
+      CONFIG_MAX_SRA_VAL);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGSra.Us_Vdsl,
+      CONFIG_MIN_SRA_VAL,
+      CONFIG_MAX_SRA_VAL);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCFGSra.Ds_Vdsl,
+      CONFIG_MIN_SRA_VAL,
+      CONFIG_MAX_SRA_VAL);
+
+   /* Use API internal default configuration */
+   if (sCFGSra.Us_Adsl == CONFIG_MAX_SRA_VAL)
+      sCFGSra.Us_Adsl = 0;
+
+   if (sCFGSra.Ds_Adsl == CONFIG_MAX_SRA_VAL)
+      sCFGSra.Ds_Adsl = 0;
+
+   if (sCFGSra.Us_Vdsl == CONFIG_MAX_SRA_VAL)
+      sCFGSra.Us_Vdsl = 1;
+
+   if (sCFGSra.Ds_Vdsl == CONFIG_MAX_SRA_VAL)
+      sCFGSra.Ds_Vdsl = 1;
+
+   for (dslMode = DSL_MODE_ADSL; dslMode < DSL_MODE_LAST; ++dslMode)
+   {
+      for (accessDir = DSL_UPSTREAM; accessDir < DSL_ACCESSDIR_LAST; ++accessDir)
+      {
+         memset(&sg997RA, 0x0, sizeof(DSL_G997_RateAdaptationConfig_t));
+
+         sg997RA.nDslMode = dslMode;
+         sg997RA.nDirection = accessDir;
+
+         if (dslMode == DSL_MODE_ADSL)
+         {
+            if (accessDir == DSL_UPSTREAM)
+            {
+               CONFIG_PARAM_APPLY(
+                  sg997RA.data.RA_MODE,
+                  (sCFGSra.Us_Adsl + g997RAShift));
+            }
+            else
+            {
+               CONFIG_PARAM_APPLY(
+                  sg997RA.data.RA_MODE,
+                  (sCFGSra.Ds_Adsl + g997RAShift));
+            }
+         }
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+         else
+         {
+            if (accessDir == DSL_UPSTREAM)
+            {
+               CONFIG_PARAM_APPLY(
+                  sg997RA.data.RA_MODE,
+                  (sCFGSra.Us_Vdsl + g997RAShift));
+            }
+            else
+            {
+               CONFIG_PARAM_APPLY(
+                  sg997RA.data.RA_MODE,
+                  (sCFGSra.Ds_Vdsl + g997RAShift));
+            }
+         }
+#endif /* INCLUDE_DSL_CPE_API_VRX */
+
+         nRet = DSL_CPE_Ioctl(
+                     pControlContext->fd[nDevNum],
+                     DSL_FIO_G997_RATE_ADAPTATION_CONFIG_SET,
+                     (int) &sg997RA);
+
+         /* store error code in case of failure */
+         if (nRet != DSL_SUCCESS)
+         {
+            nErrCode = nRet;
+
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_VDSL_PROFILE_CONFIG_SET ioctl failed, "
+               "error=%d!" DSL_CPE_CRLF,
+               nRet));
+         }
+
+         /* on failure print additional debug info */
+         if (sg997RA.accessCtl.nReturn)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+               "WARNING - DSL_FIO_VDSL_PROFILE_CONFIG "
+               "access control retCode=%d!" DSL_CPE_CRLF,
+               sg997RA.accessCtl.nReturn));
+         }
+      }
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_G997_RateAdaptationCfgValidateAndApply, retCode=%d"
+      DSL_CPE_CRLF, nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   This function applies SystemInterface configuration taken from the
+   config file
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_SysIfCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrCode = DSL_SUCCESS;
+   DSL_SystemInterfaceConfig_t sSystemIfConfig = { 0 };
+   DSL_CFG_SystemInterface_t sCfgSystemIfConfig;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_SysIfCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   sCfgSystemIfConfig = g_sConfiguration.data.sSystemIfConfig;
+
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCfgSystemIfConfig.nTcLayer_Adsl,
+      DSL_TC_UNKNOWN,
+      DSL_TC_EFM_FORCED);
+   CONFIG_PARAM_RANGE_VALIDATION(
+      sCfgSystemIfConfig.nTcLayer_Vdsl,
+      DSL_TC_UNKNOWN,
+      DSL_TC_EFM_FORCED);
+
+   memset(&sSystemIfConfig, 0x0, sizeof(DSL_SystemInterfaceConfig_t));
+   sSystemIfConfig.nDslMode = DSL_MODE_ADSL;
+
+   nRet = DSL_CPE_Ioctl(
+               pControlContext->fd[nDevNum],
+               DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET,
+               (int) &sSystemIfConfig);
+
+   if (nRet == DSL_SUCCESS)
+   {
+      /* if TcLayer_Adsl is "0" the API internal default
+         configuration value DSL_TC_ATM shall be used */
+      if (sCfgSystemIfConfig.nTcLayer_Adsl == 0)
+      {
+         sSystemIfConfig.data.nTcLayer = DSL_TC_ATM;
+      }
+      else
+      {
+         CONFIG_PARAM_APPLY(
+            sSystemIfConfig.data.nTcLayer,
+            sCfgSystemIfConfig.nTcLayer_Adsl);
+      }
+
+      nRet = DSL_CPE_Ioctl(
+                  pControlContext->fd[nDevNum],
+                  DSL_FIO_SYSTEM_INTERFACE_CONFIG_SET,
+                  (int) &sSystemIfConfig);
+
+      /* store error code in case of failure */
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+            "ERROR - DSL_FIO_OPERATOR_CONFIG_SET ioctl failed, "
+            "error=%d!" DSL_CPE_CRLF,
+            nRet));
+      }
+   }
+   else
+   {
+      nErrCode = nRet;
+
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nRet));
+   }
+
+   /* on failure print additional debug info */
+   if (sSystemIfConfig.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "wARNING - DSL_FIO_SYSTEM_INTERFACE_CONFIG "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sSystemIfConfig.accessCtl.nReturn));
+   }
+
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+   memset(&sSystemIfConfig, 0x0, sizeof(DSL_SystemInterfaceConfig_t));
+   sSystemIfConfig.nDslMode = DSL_MODE_VDSL;
+
+   nRet = DSL_CPE_Ioctl(
+               pControlContext->fd[nDevNum],
+               DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET,
+               (int) &sSystemIfConfig);
+
+   if (nRet == DSL_SUCCESS)
+   {
+      /* if TcLayer_Vdsl is "0" the API internal default
+         configuration value DSL_TC_EFM shall be used */
+      if (sCfgSystemIfConfig.nTcLayer_Vdsl == 0)
+      {
+         sSystemIfConfig.data.nTcLayer = DSL_TC_EFM;
+      }
+      else
+      {
+         CONFIG_PARAM_APPLY(
+            sSystemIfConfig.data.nTcLayer,
+            sCfgSystemIfConfig.nTcLayer_Vdsl);
+      }
+
+      nRet = DSL_CPE_Ioctl(
+                  pControlContext->fd[nDevNum],
+                  DSL_FIO_SYSTEM_INTERFACE_CONFIG_SET,
+                  (int) &sSystemIfConfig);
+
+      /* store error code in case of failure */
+      if (nRet != DSL_SUCCESS)
+      {
+         nErrCode = nRet;
+
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+            "ERROR - DSL_FIO_OPERATOR_CONFIG_SET ioctl failed, "
+            "error=%d!" DSL_CPE_CRLF,
+            nRet));
+      }
+   }
+   else
+   {
+      nErrCode = nRet;
+
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nRet));
+   }
+
+   /* on failure print additional debug info */
+   if (sSystemIfConfig.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "wARNING - DSL_FIO_SYSTEM_INTERFACE_CONFIG "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sSystemIfConfig.accessCtl.nReturn));
+   }
+#endif
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_SysIfCfgValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   This function applies XTSE configuration taken from the config file
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_XtseCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_G997_XTUSystemEnabling_t sXtse = { 0 };
+   const unsigned char *pG997XtuVal = DSL_NULL;
+   DSL_int_t i;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_XtseCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   pG997XtuVal = g_sConfiguration.data.G997XtuVal;
+
+   nErrCode = DSL_CPE_Ioctl(
+                  pControlContext->fd[nDevNum],
+                  DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET,
+                  (int) &sXtse);
+
+   if (nErrCode == DSL_SUCCESS)
+   {
+      for (i = 0; i < DSL_G997_NUM_XTSE_OCTETS; i++)
+      {
+         sXtse.data.XTSE[i] = pG997XtuVal[i];
+      }
+
+      nErrCode = DSL_CPE_Ioctl(
+                     pControlContext->fd[nDevNum],
+                     DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_SET,
+                     (int) &sXtse);
+
+      /* store error code in case of failure */
+      if (nErrCode != DSL_SUCCESS)
+      {
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+            "ERROR - DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_SET ioctl failed, "
+            "error=%d!" DSL_CPE_CRLF,
+            nErrCode));
+      }
+   }
+   else
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nErrCode));
+   }
+
+   /* on failure print additional debug info */
+   if (sXtse.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "wARNING - DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sXtse.accessCtl.nReturn));
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_XtseCfgValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+/*
+   This function applies Vectoring configuration taken from the config file
+
+   \note Vectoring is only supported for VDSL
+
+   \param nDevNum    Device number, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_VectoringEnableCfgApply(
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   unsigned int nVectoringEnable = 0;
+   DSL_int_t nMeiFd;
+   DSL_char_t meiDevName[32] = {0};
+   IOCTL_MEI_dsmConfig_t sDsmConfig;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_VectoringEnableCfgApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   nVectoringEnable = g_sConfiguration.data.sCommonConfig.VectoringEnable;
+
+   CONFIG_PARAM_RANGE_VALIDATION(
+      nVectoringEnable,
+      e_MEI_VECTOR_CTRL_OFF,
+      e_MEI_VECTOR_CTRL_AUTO);
+
+   memset(&sDsmConfig, 0, sizeof(IOCTL_MEI_dsmConfig_t));
+   sDsmConfig.eVectorControl = nVectoringEnable;
+
+   snprintf(meiDevName, sizeof(meiDevName), "/dev/mei_cpe/%u", nDevNum);
+   nMeiFd = DSL_CPE_Open(meiDevName);
+   if (nMeiFd <= 0)
+   {
+      DSL_CPE_Close(nMeiFd);
+
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - MEI Driver <%s> does not exist!" DSL_CPE_CRLF,
+         meiDevName));
+      return DSL_ERROR;
+   }
+
+   nErrCode = DSL_CPE_Ioctl(nMeiFd,
+                  FIO_MEI_DSM_CONFIG_SET,
+                  (int) &sDsmConfig);
+
+   if (nErrCode != DSL_SUCCESS)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - FIO_MEI_DSM_CONFIG_SET ioctl failed, error=%d!" DSL_CPE_CRLF,
+         nErrCode));
+   }
+
+   /* on failure print additional debug info */
+   if (sDsmConfig.ictl.retCode)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - FIO_MEI_DSM_CONFIG "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sDsmConfig.ictl.retCode));
+   }
+
+   DSL_CPE_Close(nMeiFd);
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_VectoringEnableCfgApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+#endif /* defined(INCLUDE_DSL_CPE_API_VRX) */
+
+/*
+   This function applies FW message polling mode (for API) configuration
+   taken from the config file
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_FwMessagePollingCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_boolean_t bFWMsgPollingOnly;
+   DSL_InstanceControl_t sInstanceControl;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_FwMessagePollingCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   bFWMsgPollingOnly = g_sConfiguration.data.sCommonConfig.FWMsgPollingOnly;
+
+   memset(&sInstanceControl, 0x0, sizeof(DSL_InstanceControl_t));
+   sInstanceControl.data.bEventActivation = DSL_TRUE;
+   sInstanceControl.data.bFwEventActivation = bFWMsgPollingOnly == DSL_TRUE ?
+           DSL_FALSE : DSL_TRUE;
+
+   nErrCode = DSL_CPE_Ioctl(
+                  pControlContext->fd[nDevNum],
+                  DSL_FIO_INSTANCE_CONTROL_SET,
+                  (int) &sInstanceControl);
+
+   /* store error code in case of failure */
+   if (nErrCode != DSL_SUCCESS)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_INSTANCE_CONTROL_SET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nErrCode));
+   }
+
+   /* on failure print additional debug info */
+   if (sInstanceControl.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "wARNING - DSL_FIO_INSTANCE_CONTROL "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sInstanceControl.accessCtl.nReturn));
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_FwMessagePollingCfgValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   This function applies OperatorSelect value taken from the config file
+
+   \note Vectoring is only supported for VDSL
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+   \param nDevNum             Number of device for configuration, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+static DSL_Error_t DSL_CPE_OperatorSelectCfgValidateAndApply(
+   DSL_CPE_Control_Context_t *pControlContext,
+   const DSL_uint32_t nDevNum)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_uint16_t nOperatorSelect;
+   DSL_OperatorConfig_t sOperatorConfig;
+   /* FW message values defined with MCAT is defined for 0..19
+      but FW will block reserved values from within full-scale of 8-bit */
+   const DSL_uint8_t CONFIG_MIN_OPERATOR_SELECT_VAL = 0;
+   const DSL_uint8_t CONFIG_MAX_OPERATOR_SELECT_VAL = 255;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_OperatorSelectCfgValidateAndApply, device<%u>" DSL_CPE_CRLF,
+      nDevNum));
+
+   nOperatorSelect = (DSL_uint16_t)g_sConfiguration.data.sCommonConfig.nOperatorSelect;
+
+   CONFIG_PARAM_RANGE_VALIDATION(
+      nOperatorSelect,
+      CONFIG_MIN_OPERATOR_SELECT_VAL,
+      CONFIG_MAX_OPERATOR_SELECT_VAL);
+
+   memset(&sOperatorConfig, 0, sizeof(DSL_OperatorConfig_t));
+   sOperatorConfig.data.nDslOperator = nOperatorSelect;
+
+   nErrCode = DSL_CPE_Ioctl(
+                  pControlContext->fd[nDevNum],
+                  DSL_FIO_OPERATOR_CONFIG_SET,
+                  (int) &sOperatorConfig);
+
+   /* store error code in case of failure */
+   if (nErrCode != DSL_SUCCESS)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_FIO_OPERATOR_CONFIG_SET ioctl failed, "
+         "error=%d!" DSL_CPE_CRLF,
+         nErrCode));
+   }
+
+   /* on failure print additional debug info */
+   if (sOperatorConfig.accessCtl.nReturn)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - DSL_FIO_OPERATOR_CONFIG "
+         "access control retCode=%d!" DSL_CPE_CRLF,
+         sOperatorConfig.accessCtl.nReturn));
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_OperatorSelectCfgValidateAndApply, retCode=%d" DSL_CPE_CRLF,
+      nErrCode));
+
+   return nErrCode;
+}
+
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
diff --git a/src/dsl_cpe_configuration_parser.h b/src/dsl_cpe_configuration_parser.h
new file mode 100644
index 0000000000000000000000000000000000000000..a238c7a4039248554a271ae127ac1f07855775a9
--- /dev/null
+++ b/src/dsl_cpe_configuration_parser.h
@@ -0,0 +1,352 @@
+/******************************************************************************
+
+         Copyright 2018 - 2019 Intel Corporation
+
+  For licensing information, see the file 'LICENSE' in the root folder of
+  this software module.
+
+*******************************************************************************/
+
+#ifndef _DSL_CPE_CONFIGURATION_PARSER_H
+#define _DSL_CPE_CONFIGURATION_PARSER_H
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+
+typedef struct
+{
+   /**
+      NextMode (DSL) to be used on API startup
+      Only of relevance if xDSL multimode is enabled by using VDSL and ADSL
+      G997 XTU octet bits.
+      NextMode
+         0: use API-default value (if A+V modes are selected VDSL will be used)
+         1: use ADSL mode as initial one for multimode handling
+         2: use VDSL mode as initial one for multimode handling
+   */
+   unsigned int nNextMode;
+
+   /** MaxDeviceNumber provided by the MEI Driver */
+   unsigned int nMaxDeviceNumber;
+
+   /** LinesPerDevice provided by the MEI Driver */
+   unsigned int nLinesPerDevice;
+
+   /** ChannelsPerLine provided by the MEI Driver */
+   unsigned int nChannelsPerLine;
+} DSL_CFG_StartupInit_t;
+
+typedef struct
+{
+   /** Bitswap config for US in VDSL */
+   bool Us_Vdsl;
+
+   /** Bitswap config for DS in VDSL */
+   bool Ds_Vdsl;
+
+   /** Bitswap config for US in ADSL */
+   bool Us_Adsl;
+
+   /** Bitswap config for DS in ADSL */
+   bool Ds_Adsl;
+} DSL_CFG_Bitswap_t;
+
+typedef struct
+{
+   /** Retransmission config for US in ADSL */
+   unsigned int Us_Adsl;
+
+   /** Retransmission config for DS in ADSL */
+   unsigned int Ds_Adsl;
+
+   /** Retransmission config for US in VDSL */
+   unsigned int Us_Vdsl;
+
+   /** Retransmission config for DS in VDSL */
+   unsigned int Ds_Vdsl;
+} DSL_CFG_Retransmission_t;
+
+typedef struct
+{
+   /** SRA config for US in ADSL */
+   unsigned int Us_Adsl;
+
+   /** SRA config for DS in ADSL */
+   unsigned int Ds_Adsl;
+
+   /** SRA config for US in VDSL */
+   unsigned int Us_Vdsl;
+
+   /** SRA config for DS in VDSL */
+   unsigned int Ds_Vdsl;
+} DSL_CFG_Sra_t;
+
+typedef struct
+{
+   /** Virtual Noise config for US */
+   bool Us;
+
+   /** Virtual Noise config for DS */
+   bool Ds;
+} DSL_CFG_VirtualNoise_t;
+
+typedef struct
+{
+   /**
+      The value selects the activated reboot criteria's according to the
+      following bitmask definitions.
+      Please note that some values are used only within ADSL or VDSL. For
+      details please refer to the UMPR of the DSL CPE API.
+      DEFAULT value for ADSL is "4F"
+      DEFAULT value for VDSL is "F"
+         0: CLEANED (no reboot criteria active)
+         1: LOM              - default ON
+         2: LOF              - default ON
+         4: LOS              - default ON
+         8: ESE              - default ON
+         10: ES90             - default OFF
+         20: SES30            - default OFF
+         40: NEGATIVE_MARGIN  - default ON for ADSL / OFF for VDSL
+         80: OOS_BC0          - default OFF
+         100: OOS_BC1          - default OFF
+         200: NCD_BC0          - default OFF
+         400: NCD_BC1          - default OFF
+         800: LCD_BC0          - default OFF
+         1000: LCD_BC1          - default OFF
+   */
+   unsigned int Adsl;
+   unsigned int Vdsl;
+} DSL_CFG_RebootCriteria_t;
+
+typedef struct
+{
+   /**
+      The value selects the activated handshake tones according to the
+      following bitmask definitions.
+      The default values are related to the DSL operation mode. Please refer to
+      the UMPR of the DSL CPE API for all details.
+         1: VDSL2 B43
+         2: VDSL2 A43
+         4: VDSL2 V43
+         8: VDSL1 V43POTS
+         10: VDSL1 V43ISDN
+         20: ADSL1 C43
+         40: ADSL2 J43
+         80: ADSL2 B43C
+         100: ADSL2 A43C
+   */
+   unsigned int Adsl;
+   unsigned int Vdsl;
+} DSL_CFG_LowLevelHsTones_t;
+
+typedef struct
+{
+   /**
+      The value selects the system interface configuration for ADSL and VDSL modes
+      according to the following bitmask definitions:
+         0: Use API internal defaults
+         1: ATM-TC
+         2: EFM/PTM-TC
+         4: Auto-TC
+   */
+   unsigned int nTcLayer_Adsl;
+   unsigned int nTcLayer_Vdsl;
+} DSL_CFG_SystemInterface_t;
+
+typedef struct
+{
+   /**
+      Configuration of test and debug interface usage
+         0: Do not use debug and test interfaces.
+               Independent from feature availability.
+         1: Use debug and test interfaces on LAN interfaces only. - DEFAULT
+               Dependent on feature availability.
+         2: Use debug and test interfaces on ALL available interfaces.
+               Dependent on feature availability. Former default value.
+   */
+   unsigned int nDebugAndTestInterfaces;
+} DSL_CFG_Debugging_t;
+
+typedef struct
+{
+   /**
+      The message selects a DSL operator.
+      The information is used to configure operator specific settings inside the DSL firmware.
+   */
+   unsigned int nOperatorSelect;
+
+   /**
+      Configuration of API shutdown handling in case of using autoboot control
+      command "acs <nLine> 7" (DSL_CFG_AUTOBOOT_CTRL_STOP_PD)
+         LdAfeShutdown
+            0: Do not shutdown the Line Driver and the AFE
+                  This option should be used for example in case of underlying
+                  ISDN service is used and an impedance change of the line should
+                  be avoided
+            1: Shutdown the Line Driver and the AFE - DEFAULT
+                  This option is selected by default and make use of a specific DSL FW
+                  messages (if supported) to power down the LD/AFE
+   */
+   unsigned int LdAfeShutdown;
+
+   /**
+      Configuration of test and debug specific vectoring setting
+         VectoringEnable
+            0: Disable any vectoring operation
+            1: Enables the G.993.5 full G.Vector for US and DS)
+            2: Enables the G.993.2 Annex Y (G.Vector friendly)
+            3: Enables automatic detection for the best fitting configuration
+      Notes:
+         - Vectoring is only supported for VDSL
+         - There are some additional conditions that needs to be fulfilled for
+         successful enabling of the full G.Vector functionality (Annex N)
+            + DSL Firmware needs to support vectoring, means that the last digit of the
+            firmware version has to be "7"
+            + The DSL Subsystem has to be compiled to support vectoring
+   */
+   unsigned int VectoringEnable;
+
+   /**
+      VdslProfileVal
+      The value selects the activated Vdsl profile according to the
+      following bitmask definitions.
+      Please note that 12A/12B/17A/30A are not supported for the Dual port mode.
+      DEFAULT value is "0xFF" (single port mode), "0xF" (dual port mode).
+         1: 8A
+         2: 8B
+         4: 8C
+         8: 8D
+         10: 12A
+         20: 12B
+         40: 17A
+         80: 30A
+         100: 35B
+   */
+   unsigned int VdslProfileVal;
+
+   /**
+      Configuration of Non-standard activation sequence
+         ActSeq
+            0: Automatic detection from XTSE configuration (enables Non-standard
+                  activation sequence in case of T1.413 is enabled as well)
+            1: Standard Handshake (G.HS)  - DEFAULT
+            2: Non-standard activation sequence ("Telefonica switching mode")
+   */
+   unsigned int ActSeq;
+
+   /**
+      Configuration of initial activation mode
+         ActMode (only used if "ActMode" equals "2" or
+         "ActMode" equals "0" and T1.413 mode is included within XTSE octets)
+            1: Start with G.HS activation mode  - DEFAULT
+            2: Start with ANSI-T1.413 activation mode
+   */
+   unsigned int ActMode;
+
+   /**
+      Configuration of remember functionality used in case of activated xDSL multimode
+         Remember
+            0: disable remember functionality
+            1: enable remember functionality
+   */
+   unsigned int Remember;
+
+   /**
+      Test and debug configuration to enable event based (autonomous FW message
+      handling) mode instead of polling (which is default within API and strictly
+      recommended to be used!)
+         xDSL_Dbg_FwMsgPollingOnly
+         0: Use autonomous FW message handling (instead of polling)
+         1: Use polling mode only - DEFAULT
+   */
+   bool FWMsgPollingOnly;
+
+   DSL_CFG_LowLevelHsTones_t sLowLevelHsTonesConfig;
+} DSL_CFG_Common_t;
+
+typedef struct
+{
+   /** Debugging configuration */
+   DSL_CFG_Debugging_t sDebuggingConfig;
+
+   /** StartupInit configuration */
+   DSL_CFG_StartupInit_t sStartupInitConfig;
+
+   /** Bitswap configuration */
+   DSL_CFG_Bitswap_t sBitswapConfig;
+
+   /** Retransmission configuration */
+   DSL_CFG_Retransmission_t sRetransmissionConfig;
+
+   /** Sra configuration */
+   DSL_CFG_Sra_t sSraConfig;
+
+   /** VirtualNoise configuration */
+   DSL_CFG_VirtualNoise_t sVirtualNoiseConfig;
+
+   /** Reboot criteria configuration */
+   DSL_CFG_RebootCriteria_t sRebootCriteriaConfig;
+
+   /** SystemInterface configuration */
+   DSL_CFG_SystemInterface_t sSystemIfConfig;
+
+   /** Common configuration */
+   DSL_CFG_Common_t sCommonConfig;
+
+   /**
+      Configuration of test and debug specific DSL activation mode settings
+      G997 XTU octet bits.
+         G997XtuVal (only used in case of "G997XtuVal" equals "1")
+   */
+   unsigned char G997XtuVal[DSL_G997_NUM_XTSE_OCTETS];
+
+} DSL_ConfigurationData_t;
+
+typedef struct
+{
+   /**
+   Structure that contains initialization data */
+   DSL_ConfigurationData_t data;
+} DSL_Configuration_t;
+
+/*
+   This function initialize internal structures of Configuration module.
+
+   \remark Should be called only once and at application startup.
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+DSL_Error_t DSL_CPE_ConfigInit();
+
+/*
+   This function provides accesss to current configuration params.
+
+   \param pConfiguration      Pointer to pointer to
+                              DSL_Configuration_t structure, [O]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+DSL_Error_t DSL_CPE_ConfigGet(
+   const DSL_Configuration_t **pConfiguration
+);
+
+/*
+   This function executes readout of configuration file then
+   validation and appliance of configuration params.
+
+   \param pControlContext     Pointer to DSL CPE Control context structure, [I]
+
+   \return  Return values are defined within the \ref DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+DSL_Error_t DSL_CPE_ConfigUpdate(
+   DSL_CPE_Control_Context_t *pCtrlCtx
+);
+
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
+#endif /* _LIB_DSL_CONFIGURATION_PARSER_H */
diff --git a/src/dsl_cpe_control.c b/src/dsl_cpe_control.c
index e579125039e2bde56d0def5be5777a0b3c9233d8..55c19e69a36abbaf7c581ab0023419aa89d7379c 100644
--- a/src/dsl_cpe_control.c
+++ b/src/dsl_cpe_control.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -17,7 +19,19 @@ Includes
 #include "dsl_cpe_debug.h"
 #include "drv_dsl_cpe_api_ioctl.h"
 #include "dsl_cpe_simulator.h"
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+#include "dsl_cpe_status_parser.h"
+   #if defined(DSL_DEBUG_TOOL_INTERFACE) || defined(INCLUDE_DSL_CPE_DTI_SUPPORT)
+   #include <ifaddrs.h>    /* getifaddrs */
+   #include <arpa/inet.h>  /* inet_ntoa */
+   #endif
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
 #include <limits.h>
+#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 
 #if defined (INCLUDE_DSL_CPE_API_DANUBE)
 #include "drv_dsl_cpe_cmv_danube.h"
@@ -35,6 +49,10 @@ Includes
 
 #include "dsl_cpe_init_cfg.h"
 
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+#include "dsl_cpe_configuration_parser.h"
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
 #undef DSL_CCA_DBG_BLOCK
 #define DSL_CCA_DBG_BLOCK DSL_CCA_DBG_APP
 
@@ -153,8 +171,14 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_Help (
    DSL_char_t * sApplicationName
 );
 
+DSL_CPE_STATIC  DSL_void_t DSL_CPE_Interruption(void);
+
 DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termination(void);
 
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+DSL_CPE_STATIC  DSL_void_t DSL_CPE_Reconfiguration(void);
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
 DSL_CPE_STATIC DSL_Error_t DSL_CPE_FwInfoFromWhatstringGet(
    DSL_char_t *pWhatString,
    DSL_int_t *pFwApplication,
@@ -290,8 +314,8 @@ DSL_CPE_STATIC  DSL_Error_t DSL_CPE_Control_Exit (DSL_void_t * pContext);
    #define DSL_CPE_DEFAULT_FIRMWARE_1  "/opt/lantiq/firmware/ModemHWE.bin"
    #define DSL_CPE_DEFAULT_FIRMWARE_2  ""
 #elif defined(INCLUDE_DSL_CPE_API_VRX)
-   #define DSL_CPE_DEFAULT_FIRMWARE_1  "/opt/lantiq/firmware/xcpe_hw.bin"
-   #define DSL_CPE_DEFAULT_FIRMWARE_2  "/opt/lantiq/firmware/xcpe_hw_2p.bin"
+   #define DSL_CPE_DEFAULT_FIRMWARE_1  "/lib/firmware/xcpe_hw.bin"
+   #define DSL_CPE_DEFAULT_FIRMWARE_2  "/lib/firmware/xcpe_hw_2p.bin"
 #endif
 #elif defined(VXWORKS)
 #if defined (INCLUDE_DSL_CPE_API_DANUBE)
@@ -319,6 +343,7 @@ DSL_CPE_STATIC  DSL_Error_t DSL_CPE_Control_Exit (DSL_void_t * pContext);
 
 const DSL_char_t *sDefaultFirmwareName1 = (DSL_char_t *)DSL_CPE_DEFAULT_FIRMWARE_1;
 const DSL_char_t *sDefaultFirmwareName2 = (DSL_char_t *)DSL_CPE_DEFAULT_FIRMWARE_2;
+const DSL_uint8_t g_nDefaultFWDownloadTimeoutSec = 10;
 
 #ifdef INCLUDE_SCRIPT_NOTIFICATION
    #if defined (INCLUDE_DSL_CPE_API_DANUBE)
@@ -706,13 +731,14 @@ DSL_void_t DSL_CPE_ArraySPrintF(
    DSL_uint16_t i = 0, j = 0, elements = 0;
    DSL_uint32_t nVal = 0;
    DSL_char_t c;
-   DSL_int_t ret = 0;
+   DSL_int_t ret = 0, counter = 256;
 
    elements = nSrcSize/nSrcElementSize;
 
    if (nFormat == DSL_ARRAY_FORMAT_HEX)
    {
-      ret = sprintf(pDst, "(");
+      ret = snprintf(pDst, counter, "(");
+      counter -= ret;
       pDst++;
    }
 
@@ -720,7 +746,8 @@ DSL_void_t DSL_CPE_ArraySPrintF(
    {
       if ((i != 0) && (nFormat == DSL_ARRAY_FORMAT_HEX))
       {
-         ret = sprintf(pDst, ",");
+         ret = snprintf(pDst, counter, ",");
+         counter -= ret;
          pDst ++;
       }
 
@@ -729,21 +756,22 @@ DSL_void_t DSL_CPE_ArraySPrintF(
          switch (nSrcElementSize)
          {
          case 1:
-            ret = sprintf(pDst, "%02X", ((DSL_uint8_t*)pSrc)[i]);
+            ret = snprintf(pDst, counter, "%02X", ((DSL_uint8_t*)pSrc)[i]);
             break;
          case 2:
-            ret = sprintf(pDst, "%04X", ((DSL_uint16_t*)pSrc)[i]);
+            ret = snprintf(pDst, counter, "%04X", ((DSL_uint16_t*)pSrc)[i]);
             break;
          case 4:
-            ret = sprintf(pDst, "%08X", ((DSL_uint32_t*)pSrc)[i]);
+            ret = snprintf(pDst, counter, "%08X", ((DSL_uint32_t*)pSrc)[i]);
             break;
          default:
-            ret = sprintf(pDst, "xx");
+            ret = snprintf(pDst, counter, "xx");
             break;
          }
 
          if(ret > 0)
          {
+            counter -= ret;
             pDst += ret;
          }
       }
@@ -770,14 +798,16 @@ DSL_void_t DSL_CPE_ArraySPrintF(
             c = (DSL_char_t)(nVal >> j);
             if (isprint((int)c) != 0)
             {
-               ret = sprintf(pDst, "%c", c);
+               ret = snprintf(pDst, counter, "%c", c);
+               counter -= ret;
                pDst += ret;
             }
             else
             {
                if (nFormat == DSL_ARRAY_FORMAT_PRINT_STRING)
                {
-                  ret = sprintf(pDst, "%c", '.');
+                  ret = snprintf(pDst, counter, "%c", '.');
+                  counter -= ret;
                   pDst += ret;
                }
             }
@@ -787,7 +817,7 @@ DSL_void_t DSL_CPE_ArraySPrintF(
 
    if (nFormat == DSL_ARRAY_FORMAT_HEX)
    {
-      ret = sprintf(pDst, ")");
+      ret = snprintf(pDst, counter, ")");
    }
 }
 
@@ -859,7 +889,7 @@ DSL_Error_t DSL_CPE_GetMacAdrFromString(
    DSL_char_t *token;
    DSL_int_t i = 0;
 
-   strncpy (string, pString, sizeof(string)-1);
+   cpe_control_strncpy_s(string, sizeof(string)-1, pString, strlen(pString));
    string[sizeof(string)-1] = 0;
 
    /* Get first token */
@@ -951,7 +981,7 @@ DSL_CPE_STATIC DSL_int_t DSL_CPE_ArgsExtract(
    /* Set pointer to beginning of next parameter group */
    if ((**pArg == '_') && (*(*pArg+1) != '\0')) *pArg = *pArg + 1;
 
-   strncpy (cString, *pArg, sizeof(cString)-1);
+   cpe_control_strncpy_s(cString, sizeof(cString)-1, *pArg, strlen(*pArg));
    cString[sizeof(cString)-1]=0;
    pcToken = strtok (cString, pcSeparators);
 
@@ -1040,18 +1070,17 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
 {
    DSL_char_t *pEndPtr = "\0";
 
-   DSL_char_t string[30] = { 0 };
+   DSL_char_t string[30];
    DSL_int_t i = 0;
    DSL_uint32_t nVal = 0;
    DSL_char_t seps[]   = "_";
    DSL_char_t *token, *errMask;
    DSL_int_t option_index = 1;
 
-
-
    while (1)
    {
       DSL_int_t c;
+      memset(string, 0, sizeof(string));
 
       /* 1 colon means there is a required parameter */
       /* 2 colons means there is an optional parameter */
@@ -1086,7 +1115,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
          g_sRemoteTcpServerIp = DSL_CPE_Malloc(strlen (optarg) + 1);
          if (g_sRemoteTcpServerIp)
          {
-            strcpy (g_sRemoteTcpServerIp, optarg);
+            memset(g_sRemoteTcpServerIp, 0, strlen (optarg) + 1);
+            cpe_control_strncpy_s(g_sRemoteTcpServerIp, strlen (optarg) + 1, optarg, strlen (optarg));
 
             DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
                "using %s as the remote TCP debug server IP address" DSL_CPE_CRLF,
@@ -1112,7 +1142,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
             g_sTcpMessagesSocketAddr = DSL_CPE_Malloc(strlen (optarg) + 1);
             if (g_sTcpMessagesSocketAddr)
             {
-               strcpy (g_sTcpMessagesSocketAddr, optarg);
+               memset(g_sTcpMessagesSocketAddr, 0, strlen (optarg) + 1);
+               cpe_control_strncpy_s(g_sTcpMessagesSocketAddr, strlen (optarg) + 1, optarg, strlen (optarg));
             }
          }
          else
@@ -1158,7 +1189,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
             sDtiSocketAddr = DSL_CPE_Malloc(strlen (optarg) + 1);
             if (sDtiSocketAddr)
             {
-               strcpy (sDtiSocketAddr, optarg);
+               memset(sDtiSocketAddr, 0, strlen (optarg) + 1);
+               cpe_control_strncpy_s(sDtiSocketAddr, strlen (optarg) + 1, optarg, strlen (optarg));
             }
          }
          else
@@ -1196,7 +1228,7 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
 
          if (optarg != DSL_NULL)
          {
-            strncpy (string, optarg, sizeof(string)-1);
+            cpe_control_strncpy_s(string,sizeof(string)-1, optarg, strlen(optarg));
             string[sizeof(string)-1]=0;
 
             token = strtok (string, seps);
@@ -1249,7 +1281,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
 
             if (sLowLevCfgName)
             {
-               strcpy (sLowLevCfgName, optarg);
+               memset(sLowLevCfgName, 0, strlen (optarg) + 1);
+               cpe_control_strncpy_s(sLowLevCfgName, strlen (optarg) + 1, optarg, strlen (optarg));
             }
          }
          break;
@@ -1273,7 +1306,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
             g_sRcScript = DSL_CPE_Malloc (strlen (optarg) + 1);
             if (g_sRcScript)
             {
-               strcpy (g_sRcScript, optarg);
+               memset(g_sRcScript, 0, strlen (optarg) + 1);
+               cpe_control_strncpy_s(g_sRcScript, strlen (optarg) + 1, optarg, strlen (optarg));
             }
          }
          else
@@ -1281,7 +1315,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
             g_sRcScript = DSL_CPE_Malloc (strlen (sDefaultRcScript) + 1);
             if (g_sRcScript)
             {
-               strcpy (g_sRcScript, sDefaultRcScript);
+               memset(g_sRcScript, 0, strlen (sDefaultRcScript) + 1);
+               cpe_control_strncpy_s(g_sRcScript, strlen (sDefaultRcScript) + 1, sDefaultRcScript, strlen (sDefaultRcScript));
             }
          }
          break;
@@ -1299,12 +1334,13 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
             g_sFirmwareName1 = DSL_CPE_Malloc (strlen (optarg) + 1);
             if (g_sFirmwareName1)
             {
-               strcpy (g_sFirmwareName1, optarg);
+               memset(g_sFirmwareName1, 0, strlen (optarg) + 1);
+               cpe_control_strncpy_s(g_sFirmwareName1, strlen (optarg) + 1, optarg, strlen(optarg));
             }
          }
          break;
       case 'F':
-         if (g_nLines < 2) 
+         if (g_nLines < 2)
          {
             printf(DSL_CPE_PREFIX " Firmware 2 ignored when On Chip Bonding is off ");
          }
@@ -1319,7 +1355,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
             g_sFirmwareName2 = DSL_CPE_Malloc (strlen (optarg) + 1);
             if (g_sFirmwareName2)
             {
-               strcpy (g_sFirmwareName2, optarg);
+               memset(g_sFirmwareName2, 0, strlen (optarg) + 1);
+               cpe_control_strncpy_s(g_sFirmwareName2, strlen (optarg) + 1, optarg, strlen (optarg));
             }
          }
          break;
@@ -1333,7 +1370,7 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
       case 'e':
          if (optarg != NULL)
          {
-            strncpy (string, optarg, sizeof(string)-1);
+            cpe_control_strncpy_s(string, sizeof(string)-1, optarg, strlen(optarg));
             string[sizeof(string)-1]=0;
             token = strtok (string, seps);
 
@@ -1409,7 +1446,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
             g_sAdslScript = DSL_CPE_Malloc (strlen (optarg) + 1);
             if (g_sAdslScript)
             {
-               strcpy (g_sAdslScript, optarg);
+               memset(g_sAdslScript, 0, strlen (optarg) + 1);
+               cpe_control_strncpy_s(g_sAdslScript, strlen (optarg) + 1, optarg, strlen (optarg));
             }
          }
          break;
@@ -1426,7 +1464,8 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
             g_sVdslScript = DSL_CPE_Malloc (strlen (optarg) + 1);
             if (g_sVdslScript)
             {
-               strcpy (g_sVdslScript, optarg);
+               memset(g_sVdslScript, 0, strlen (optarg) + 1);
+               cpe_control_strncpy_s(g_sVdslScript, strlen (optarg) + 1, optarg, strlen (optarg));
             }
          }
          break;
@@ -1440,7 +1479,7 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
       case 'M':
          if( optarg != NULL )
          {
-            strncpy (string, optarg, sizeof(string)-1);
+            cpe_control_strncpy_s(string, sizeof(string)-1, optarg, strlen(optarg));
                string[sizeof(string)-1]=0;
 
             token = strtok (string, seps);
@@ -1466,7 +1505,7 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
       case 'R':
          if( optarg != NULL )
          {
-            strncpy (string, optarg, sizeof(string)-1);
+            cpe_control_strncpy_s(string, sizeof(string)-1, optarg, strlen(optarg));
                string[sizeof(string)-1]=0;
 
             token = strtok (string, seps);
@@ -1492,7 +1531,7 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParse (
       case 'S':
          if( optarg != NULL )
          {
-            strncpy (string, optarg, sizeof(string)-1);
+            cpe_control_strncpy_s(string, sizeof(string)-1, optarg, strlen(optarg));
                string[sizeof(string)-1]=0;
 
             token = strtok (string, seps);
@@ -1776,9 +1815,10 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_ArgParseSysIfCfg (
    else
    {
       /* If no valid values are given for VDSL use the valid ADSL ones */
-      memcpy(&g_sSysIfCfg[DSL_MODE_VDSL],
+      cpe_control_memcpy_s(&g_sSysIfCfg[DSL_MODE_VDSL],
+             sizeof(DSL_SystemInterfaceConfigData_t),
              &g_sSysIfCfg[DSL_MODE_ADSL],
-             sizeof(DSL_SystemInterfaceConfigData_t));
+             sizeof(g_sSysIfCfg[DSL_MODE_ADSL]));
 
       DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
          "Using valid -T options from ADSL also for VDSL."
@@ -1954,7 +1994,7 @@ DSL_char_t *DSL_CPE_Fd2DevStr(DSL_int_t fd)
    DSL_char_t *pDevSrt = g_nDevNumStr;
    DSL_CPE_Control_Context_t *pCtx = DSL_NULL;
 
-   sprintf (pDevSrt, "%s", "");
+   snprintf(pDevSrt, sizeof(g_nDevNumStr), "%s", "");
 
    /* Get Global Context pointer*/
    pCtx = DSL_CPE_GetGlobalContext();
@@ -1970,7 +2010,7 @@ DSL_char_t *DSL_CPE_Fd2DevStr(DSL_int_t fd)
       {
          if (fd == pCtx->fd[i])
          {
-            sprintf (pDevSrt, " nDevice=%d", i);
+            snprintf(pDevSrt, sizeof(g_nDevNumStr), " nDevice=%d", i);
             return pDevSrt;
          }
       }
@@ -2355,7 +2395,7 @@ DSL_Error_t DSL_CPE_DownloadFirmware(
             }
 
             ldFw.data.bChunkDonwloadEnabled = DSL_TRUE;
-            memcpy(&ldFw.data.firmwareFeatures, &g_nFwFeatures1, sizeof(DSL_FirmwareFeatures_t));
+            cpe_control_memcpy_s(&ldFw.data.firmwareFeatures, sizeof(DSL_FirmwareFeatures_t), &g_nFwFeatures1, sizeof(g_nFwFeatures1));
 
             ldFw.data.bForceDownload = pContext->bForceFirmwareDownload[nDevice];
             pContext->bForceFirmwareDownload[nDevice] = DSL_FALSE;
@@ -2412,7 +2452,8 @@ DSL_Error_t DSL_CPE_DownloadFirmware(
                g_sFirmwareName1 = DSL_CPE_Malloc (strlen (pcFw) + 1);
                if (g_sFirmwareName1)
                {
-                  strcpy (g_sFirmwareName1, pcFw);
+                  memset(g_sFirmwareName1, 0, strlen (pcFw) + 1);
+                  cpe_control_strncpy_s(g_sFirmwareName1, strlen (pcFw) + 1, pcFw, strlen (pcFw));
                }
             }
          }
@@ -2453,7 +2494,8 @@ DSL_Error_t DSL_CPE_DownloadFirmware(
                            g_sFirmwareName2 = DSL_CPE_Malloc (strlen (pcFw2) + 1);
                            if (g_sFirmwareName2)
                            {
-                              strcpy (g_sFirmwareName2, pcFw2);
+                              memset(g_sFirmwareName2, 0, strlen (pcFw2) + 1);
+                              cpe_control_strncpy_s(g_sFirmwareName2, strlen (pcFw2) + 1, pcFw2, strlen (pcFw2));
                            }
                         }
                      }
@@ -2482,7 +2524,8 @@ DSL_Error_t DSL_CPE_DownloadFirmware(
                            g_sFirmwareName1 = DSL_CPE_Malloc (strlen (pcFw) + 1);
                            if (g_sFirmwareName1)
                            {
-                              strcpy (g_sFirmwareName1, pcFw);
+                              memset(g_sFirmwareName1, 0, strlen (pcFw) + 1);
+                              cpe_control_strncpy_s(g_sFirmwareName1, strlen (pcFw) + 1, pcFw, strlen (pcFw));
                            }
                         }
                      }
@@ -2501,14 +2544,16 @@ DSL_Error_t DSL_CPE_DownloadFirmware(
             {
                if (pcFw2 != DSL_NULL)
                {
-                  memcpy(&ldFw.data.firmwareFeatures2, &g_nFwFeatures2, sizeof(DSL_FirmwareFeatures_t));
+                  cpe_control_memcpy_s(&ldFw.data.firmwareFeatures2, sizeof(DSL_FirmwareFeatures_t),
+                     &g_nFwFeatures2, sizeof(g_nFwFeatures2));
                }
             }
             else
             {
                if (pcFw != DSL_NULL)
                {
-                  memcpy(&ldFw.data.firmwareFeatures, &g_nFwFeatures1, sizeof(DSL_FirmwareFeatures_t));
+                  cpe_control_memcpy_s(&ldFw.data.firmwareFeatures, sizeof(DSL_FirmwareFeatures_t),
+                     &g_nFwFeatures1, sizeof(g_nFwFeatures1));
                }
             }
 
@@ -2825,7 +2870,7 @@ DSL_Error_t DSL_CPE_ScriptExecute (
       memset (buf, 0, script_buf->nSize);
 
       char nSize[14];
-      sprintf(nSize, "%%%ds", script_buf->nSize);
+      snprintf(nSize, sizeof(nSize), "%%%ds", script_buf->nSize);
 
       /* scan one line into buffer */
       if ((DSL_CPE_FGets (buf, script_buf->nSize, pFile)) == DSL_NULL)
@@ -4220,7 +4265,8 @@ DSL_CPE_STATIC DSL_int_t DSL_CPE_Event_S_AutobootStatusHandle(
 #endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
 
 #ifdef INCLUDE_DSL_CPE_CMV_SCRIPTS_SUPPORT
-   memcpy(&StatusData, pEvent->data.pData, sizeof(DSL_AutobootStatusData_t));
+   cpe_control_memcpy_s(&StatusData, sizeof(DSL_AutobootStatusData_t),
+      &(pEvent->data.pData->autobootStatus), sizeof(pEvent->data.pData->autobootStatus));
 
    switch (StatusData.nStatus)
    {
@@ -4727,10 +4773,10 @@ DSL_CPE_STATIC  DSL_int_t DSL_CPE_Event_S_ChannelDataRateHandle(
             snprintf(buff, sizeof(buff), "%u", nDevice);
             DSL_CPE_SetEnv("DSL_LINE_NUMBER", buff);
          }
-         sprintf(sVarName, "DSL_DATARATE_%s_BC%d",
+         snprintf(sVarName, sizeof(sVarName), "DSL_DATARATE_%s_BC%d",
             pEvent->data.nAccessDir == DSL_DOWNSTREAM ? "DS" : "US",
             pEvent->data.nChannel == 0 ? 0 : pEvent->data.nChannel == 1 ? 1 : 0);
-         sprintf(sVarVal, "%lu", (unsigned long)pEvent->data.pData->channelStatusData.ActualDataRate);
+         snprintf(sVarVal, sizeof(sVarVal), "%lu", (unsigned long)pEvent->data.pData->channelStatusData.ActualDataRate);
 
          if (DSL_CPE_SetEnv(sVarName, sVarVal) == DSL_SUCCESS)
          {
@@ -4899,12 +4945,15 @@ DSL_CPE_STATIC  DSL_int_t DSL_CPE_Event_S_LinitFailureHandle(
       pSubStatus = "LINIT_SUB_FAST_LOS";
       break;
 #if defined(DSL_VRX_DEVICE_VR11)
-   case LINIT_SUB_S_PP_CLOCK_NEW:
-      pSubStatus = "LINIT_SUB_S_PP_CLOCK_NEW";
+   case LINIT_SUB_S_AUTOMSG:
+      pSubStatus = "LINIT_SUB_S_AUTOMSG";
       break;
    case LINIT_SUB_S_PP_ERB_INIT:
       pSubStatus = "LINIT_SUB_S_PP_ERB_INIT";
       break;
+   case LINIT_SUB_S_REBOOT_REQ:
+      pSubStatus = "LINIT_SUB_S_REBOOT_REQ";
+      break;
 #endif /* defined(DSL_VRX_DEVICE_VR11) */
    default:
       pSubStatus = "LINIT_SUB_UNKNOWN";
@@ -5509,6 +5558,16 @@ DSL_int_t DSL_CPE_EventHandler (DSL_CPE_Thread_Params_t *param)
     defined(INCLUDE_DSL_CPE_TRACE_BUFFER)
    DSL_int_t i;
 #endif
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+   DSL_CPE_StatusNodeIdx_t eNodeIdx;
+#ifdef LINUX
+   const DSL_uint8_t DSL_STATUS_STATUS_POLLING_TIMER = 5; /* Default: 5 sec */
+   const DSL_uint8_t DSL_STATUS_STATS_POLLING_TIMER = 10; /* Default: 10 sec */
+   struct timeval tElapsed;
+   DSL_int_t nSecElapsed = 0;
+   DSL_int_t nStatusSecCnt = 0, nStatsSecCnt = 0;
+#endif /* LINUX */
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
 
 /*   DSL_EventData_Union_t eventData;*/
 
@@ -5522,6 +5581,24 @@ DSL_int_t DSL_CPE_EventHandler (DSL_CPE_Thread_Params_t *param)
       The main fd read cycle starts here.
    */
    pContext->bEvtRun = DSL_TRUE;
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+   if (DSL_CPE_StatusFileInitialize(pContext) != DSL_SUCCESS)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_CPE_EventHandler: failed to initialize status file!"
+         DSL_CPE_CRLF));
+      return DSL_ERROR;
+   }
+#ifdef LINUX
+   /* start time counter for polling status updates */
+   gettimeofday(&tElapsed, DSL_NULL);
+   nSecElapsed = tElapsed.tv_sec;
+   nStatusSecCnt = nSecElapsed;
+   nStatsSecCnt = nSecElapsed;
+#endif /* LINUX */
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
    for (;;)
    {
       if (pContext->bRun == DSL_FALSE || pContext->bEvtRun == DSL_FALSE)
@@ -5552,7 +5629,15 @@ DSL_int_t DSL_CPE_EventHandler (DSL_CPE_Thread_Params_t *param)
       /* error or timeout on select */
       if (sretval <= 0)
       {
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+#ifdef LINUX
+         goto DSL_CPE_STATUS_POLLING;
+#else
          continue;
+#endif /* LINUX */
+#else
+         continue;
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
       }
 #else
       #if defined(RTEMS)
@@ -5561,7 +5646,15 @@ DSL_int_t DSL_CPE_EventHandler (DSL_CPE_Thread_Params_t *param)
       if (sretval != 0)
       {
          /* Timeout (or Error) */
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+#ifdef LINUX
+         goto DSL_CPE_STATUS_POLLING;
+#else
          continue;
+#endif /* LINUX */
+#else
+         continue;
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
       }
       #endif /* defined(RTEMS)*/
       DSL_CPE_MSecSleep(100);
@@ -5738,6 +5831,29 @@ DSL_int_t DSL_CPE_EventHandler (DSL_CPE_Thread_Params_t *param)
                pContext, nDevice,
                event.data.nEventType,
                event.data.pData->fwDownloadStatus);
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+            /* update HW version in the status file */
+            eNodeIdx = DSL_HW_VERSION;
+            if (DSL_CPE_StatusFileEvtUpdate(
+               pContext, eNodeIdx) != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_CPE_EventHandler: failed to update "
+                  "hw version (node=%d)"
+                  DSL_CPE_CRLF, (DSL_int_t)eNodeIdx));
+            }
+            /* update FW version in the status file */
+            eNodeIdx = (nDevice == 0) ?
+               DSL_STATUS_LINE_0_FW_VERSION : DSL_STATUS_LINE_1_FW_VERSION;
+            if (DSL_CPE_StatusFileEvtUpdate(
+               pContext, eNodeIdx) != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_CPE_EventHandler: failed to update "
+                  "fw version (node=%d)"
+                  DSL_CPE_CRLF, (DSL_int_t)eNodeIdx));
+            }
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
             break;
 #ifdef INCLUDE_DSL_G997_ALARM
          case DSL_EVENT_I_DATA_PATH_FAILURES:
@@ -5749,6 +5865,19 @@ DSL_int_t DSL_CPE_EventHandler (DSL_CPE_Thread_Params_t *param)
 #endif /* INCLUDE_DSL_G997_ALARM*/
          case DSL_EVENT_S_LINE_STATE:
             DSL_CPE_Event_S_LineStateHandle(pContext, nDevice, &event);
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+            /* update line status in the status file */
+            eNodeIdx = (nDevice == 0) ?
+               DSL_STATUS_LINE_0_STATUS : DSL_STATUS_LINE_1_STATUS;
+            if (DSL_CPE_StatusFileEvtUpdate(
+                  pContext, eNodeIdx) != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_CPE_EventHandler: failed to update "
+                  "line status (node=%d)"
+                  DSL_CPE_CRLF, (DSL_int_t)eNodeIdx));
+            }
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
             break;
 #ifdef INCLUDE_DSL_PM
 #ifdef INCLUDE_DSL_CPE_PM_HISTORY
@@ -5763,10 +5892,36 @@ DSL_int_t DSL_CPE_EventHandler (DSL_CPE_Thread_Params_t *param)
 #ifdef INCLUDE_DSL_SYSTEM_INTERFACE
          case DSL_EVENT_S_SYSTEM_INTERFACE_STATUS:
             DSL_CPE_Event_S_SystemInterfaceStatusHandle(pContext, fd, nDevice, &event);
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+            /* update used link encapsulation in the status file */
+            eNodeIdx = (nDevice == 0) ?
+               DSL_STATUS_LINE_0_CHANNEL_LINKENC_USED :
+               DSL_STATUS_LINE_1_CHANNEL_LINKENC_USED;
+            if (DSL_CPE_StatusFileEvtUpdate(pContext, eNodeIdx) != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_CPE_EventHandler: failed to update "
+                  "sys-if status (node=%d)"
+                  DSL_CPE_CRLF, (DSL_int_t)eNodeIdx));
+            }
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
             break;
 #endif /* INCLUDE_DSL_SYSTEM_INTERFACE*/
          case DSL_EVENT_S_CHANNEL_DATARATE:
             DSL_CPE_Event_S_ChannelDataRateHandle(pContext, nDevice, &event);
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+            /* update datarates in the status file */
+            eNodeIdx = (nDevice == 0) ?
+               DSL_STATUS_LINE_0_CHANNEL_DATARATE :
+               DSL_STATUS_LINE_1_CHANNEL_DATARATE;
+            if (DSL_CPE_StatusFileEvtUpdate(pContext, eNodeIdx) != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_CPE_EventHandler: failed to update "
+                  "datarate status (node=%d)"
+                  DSL_CPE_CRLF, (DSL_int_t)eNodeIdx));
+            }
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
             break;
 #ifdef INCLUDE_DSL_G997_ALARM
          case DSL_EVENT_I_CHANNEL_DATARATE_SHIFT_THRESHOLD_CROSSING:
@@ -5837,6 +5992,46 @@ DSL_int_t DSL_CPE_EventHandler (DSL_CPE_Thread_Params_t *param)
          }
 #endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
       }
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+#ifdef LINUX
+DSL_CPE_STATUS_POLLING:
+      gettimeofday(&tElapsed, DSL_NULL);
+      nSecElapsed = tElapsed.tv_sec;
+
+      /* Update status on every DSL_STATUS_STATUS_POLLING_TIMER */
+      if (nSecElapsed - nStatusSecCnt >= DSL_STATUS_STATUS_POLLING_TIMER)
+      {
+         if (DSL_CPE_StatusFilePollUpdate(
+            pContext, DSL_STATUS) != DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+               "WARNING - DSL_CPE_EventHandler: STATUS polling, failed to "
+               "update some params!"
+               DSL_CPE_CRLF));
+         }
+
+         /* reset status time counter */
+         nStatusSecCnt = nSecElapsed;
+      }
+
+      /* Update stats on every DSL_STATUS_STATS_POLLING_TIMER */
+      if (nSecElapsed - nStatsSecCnt >= DSL_STATUS_STATS_POLLING_TIMER)
+      {
+         if (DSL_CPE_StatusFilePollUpdate(
+            pContext, DSL_STATS) != DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+               "WARNING - DSL_CPE_EventHandler: STATS polling, failed to "
+               "update some params!"
+               DSL_CPE_CRLF));
+         }
+
+         /* reset stats time counter */
+         nStatsSecCnt = nSecElapsed;
+      }
+#endif /* LINUX */
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
    }                            /* for */
 
    printf ("EventHandler: exit(0)\n");
@@ -6367,21 +6562,24 @@ DSL_int32_t DSL_CPE_DeviceInit (
       user via -T option */
    if (g_sSysIfCfg[DSL_MODE_ADSL].nTcLayer != DSL_TC_UNKNOWN)
    {
-      memcpy(&gInitCfgData.nDeviceCfg.sysCIF[DSL_MODE_ADSL],
-             &g_sSysIfCfg[DSL_MODE_ADSL],
-             sizeof(DSL_SystemInterfaceConfigData_t));
+      cpe_control_memcpy_s(&gInitCfgData.nDeviceCfg.sysCIF[DSL_MODE_ADSL],
+         sizeof(DSL_SystemInterfaceConfigData_t),
+         &g_sSysIfCfg[DSL_MODE_ADSL],
+         sizeof(g_sSysIfCfg[DSL_MODE_ADSL]));
    }
 #if defined(INCLUDE_DSL_CPE_API_VRX)
    if (g_sSysIfCfg[DSL_MODE_VDSL].nTcLayer != DSL_TC_UNKNOWN)
    {
-      memcpy(&gInitCfgData.nDeviceCfg.sysCIF[DSL_MODE_VDSL],
-             &g_sSysIfCfg[DSL_MODE_VDSL],
-             sizeof(DSL_SystemInterfaceConfigData_t));
+      cpe_control_memcpy_s(&gInitCfgData.nDeviceCfg.sysCIF[DSL_MODE_VDSL],
+         sizeof(DSL_SystemInterfaceConfigData_t),
+         &g_sSysIfCfg[DSL_MODE_VDSL],
+         sizeof(g_sSysIfCfg[DSL_MODE_VDSL]));
    }
 #endif /* defined(INCLUDE_DSL_CPE_API_VRX)*/
 
    /* Initialize device configuration as defined via gInitCfgData table */
-   memcpy (&init.data, &gInitCfgData, sizeof (DSL_InitData_t));
+   cpe_control_memcpy_s(&init.data, sizeof (DSL_InitData_t),
+      &gInitCfgData, sizeof(gInitCfgData));
 
 #ifndef INCLUDE_FW_REQUEST_SUPPORT
    if (bOptimize != 1)
@@ -6399,7 +6597,8 @@ DSL_int32_t DSL_CPE_DeviceInit (
                init.data.pFirmware = pFirmware1;
                init.data.nFirmwareSize = nFirmwareSize1;
                DSL_CPE_FwFeaturesGet(g_sFirmwareName1, &fwFeatures1);
-               memcpy(&init.data.nFirmwareFeatures, &fwFeatures1, sizeof(DSL_FirmwareFeatures_t));
+               cpe_control_memcpy_s(&init.data.nFirmwareFeatures, sizeof(DSL_FirmwareFeatures_t),
+                  &fwFeatures1, sizeof(fwFeatures1));
             }
          }
       }
@@ -6419,7 +6618,8 @@ DSL_int32_t DSL_CPE_DeviceInit (
                   init.data.pFirmware2 = pFirmware2;
                   init.data.nFirmwareSize2 = nFirmwareSize2;
                   DSL_CPE_FwFeaturesGet(g_sFirmwareName2, &fwFeatures2);
-                  memcpy(&init.data.nFirmwareFeatures2, &fwFeatures2, sizeof(DSL_FirmwareFeatures_t));
+                  cpe_control_memcpy_s(&init.data.nFirmwareFeatures2, sizeof(DSL_FirmwareFeatures_t),
+                     &fwFeatures2, sizeof(fwFeatures2));
                }
             }
          }
@@ -6432,9 +6632,10 @@ DSL_int32_t DSL_CPE_DeviceInit (
    {
       DSL_CPE_FwFeaturesGet(g_sFirmwareName1, &fwFeatures1);
    }
-   memcpy(&init.data.nFirmwareFeatures, &fwFeatures1,
-      sizeof(DSL_FirmwareFeatures_t));
-   memcpy(&g_nFwFeatures1, &fwFeatures1, sizeof(DSL_FirmwareFeatures_t));
+   cpe_control_memcpy_s(&init.data.nFirmwareFeatures,
+      sizeof(DSL_FirmwareFeatures_t), &fwFeatures1, sizeof(fwFeatures1));
+   cpe_control_memcpy_s(&g_nFwFeatures1, sizeof(DSL_FirmwareFeatures_t),
+      &fwFeatures1, sizeof(fwFeatures1));
 
    if (DSL_CPE_LINES_PER_DEVICE == 2)
    {
@@ -6443,9 +6644,10 @@ DSL_int32_t DSL_CPE_DeviceInit (
       {
          DSL_CPE_FwFeaturesGet(g_sFirmwareName2, &fwFeatures2);
       }
-      memcpy(&init.data.nFirmwareFeatures2, &fwFeatures2,
-             sizeof(DSL_FirmwareFeatures_t));
-      memcpy(&g_nFwFeatures2, &fwFeatures2, sizeof(DSL_FirmwareFeatures_t));
+      cpe_control_memcpy_s(&init.data.nFirmwareFeatures2,
+             sizeof(DSL_FirmwareFeatures_t), &fwFeatures2, sizeof(&fwFeatures2));
+      cpe_control_memcpy_s(&g_nFwFeatures2, sizeof(DSL_FirmwareFeatures_t),
+         &fwFeatures2, sizeof(&fwFeatures2));
    }
 
 #if defined (INCLUDE_DSL_CPE_API_DANUBE)
@@ -6460,8 +6662,8 @@ DSL_int32_t DSL_CPE_DeviceInit (
    if (bXtuOctets == 1)
    {
       /* Use given XTU octets provided on init (-i) */
-      memcpy (&init.data.nXtseCfg, &g_nXtseInit,
-         sizeof(DSL_G997_XTUSystemEnablingData_t));
+      cpe_control_memcpy_s(&init.data.nXtseCfg, sizeof(DSL_G997_XTUSystemEnablingData_t),
+         &g_nXtseInit, sizeof(g_nXtseInit));
    }
    else
    {
@@ -6509,13 +6711,16 @@ DSL_int32_t DSL_CPE_DeviceInit (
 
    memset(&inv,0x0, sizeof(DSL_G997_LineInventoryNeData_t ));
 #if defined(INCLUDE_DSL_CPE_API_VRX)
-   memcpy(&inv.Auxiliary.pData, "12344321", 8);
+   cpe_control_memcpy_s(&inv.Auxiliary.pData, 8, "12344321", sizeof("12344321"));
    inv.Auxiliary.nLength = 8;
 #endif
    /* $$ ND: this is for testing only --> */
-   memcpy (&inv.SerialNumber, "01234567890123456789012345678901", 32);
-   memcpy (&inv.SystemVendorID, G994VendorID, 8);
-   memcpy (&inv.VersionNumber, "0123456789012345", 16);
+   cpe_control_memcpy_s(&inv.SerialNumber, 32,
+      "01234567890123456789012345678901", sizeof("01234567890123456789012345678901"));
+   cpe_control_memcpy_s(&inv.SystemVendorID, 8,
+      G994VendorID, sizeof(G994VendorID));
+   cpe_control_memcpy_s(&inv.VersionNumber, 16,
+      "0123456789012345", sizeof("0123456789012345"));
    init.data.pInventory = &inv;
    /* $$ <-- */
 
@@ -6590,34 +6795,145 @@ DSL_int32_t DSL_CPE_DeviceInit (
    return ret;
 }
 
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+#if defined(DSL_DEBUG_TOOL_INTERFACE) || defined(INCLUDE_DSL_CPE_DTI_SUPPORT)
+/*
+   This function searches for given network interface names and get IPv4 address on first match.
+   If none of given network interface name is found tries to get any IPv4 address except localhost.
+
+   \param pPreferredNetIfs       Array with preferred network interfaces names, [I]
+   \param nInterfacesNum         Number of preferred interfaces in given array, [I]
+   \param pIPAddress             Array where found IP will be written, [O]
+   \param nIPAddressSize         Size of output array. [I]
+
+   \return
+   - DSL_TRUE in case of success
+   - DSL_FALSE in case of none IP found
+*/
+static DSL_boolean_t DSL_CPE_DebugAndTestInterfaceIPGet(
+   const DSL_char_t *pPreferredNetIfs[],
+   const DSL_uint32_t nInterfacesNum,
+   DSL_char_t *pIPAddress,
+   const unsigned int nIPAddressSize)
+{
+   DSL_boolean_t retVal = DSL_FALSE, bFound = DSL_FALSE, bAnyFound = DSL_FALSE;
+   DSL_uint32_t i = 0;
+   DSL_char_t *pTmpIP = DSL_NULL;
+
+   struct sockaddr_in *pAddrIn;
+   struct ifaddrs *pIfaddr, *pIfa;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_DebugAndTestInterfaceIPGet" DSL_CPE_CRLF));
+
+   if (getifaddrs(&pIfaddr) == -1)
+   {
+      return retVal;
+   }
+
+   for (pIfa = pIfaddr; pIfa != NULL; pIfa = pIfa->ifa_next)
+   {
+      if (pIfa->ifa_addr == NULL)
+         continue;
+
+      /* search only for IPv4 addresses */
+      if (pIfa->ifa_addr->sa_family == AF_INET)
+      {
+         pAddrIn = (struct sockaddr_in *)pIfa->ifa_addr;
+         pTmpIP = inet_ntoa(pAddrIn->sin_addr);
+
+         /* in case the end of operation (list iteration)
+            did not find IP of preferred network interface
+            store first valid IPv4 address which is not 127.0.0.1 */
+         if (bAnyFound != DSL_TRUE && strcmp(pTmpIP, "127.0.0.1") != 0)
+         {
+            bAnyFound = DSL_TRUE;
+
+            memset(pIPAddress, 0, nIPAddressSize);
+            cpe_control_strncpy_s(pIPAddress, nIPAddressSize, pTmpIP, strlen(pTmpIP));
+         }
+
+         /* search for match
+            between consecutive network interfase name and preferred one */
+         for (i = 0; i < nInterfacesNum; ++i)
+         {
+            if (strcmp(pIfa->ifa_name, pPreferredNetIfs[i]) == 0)
+            {
+               bFound = DSL_TRUE;
+
+               memset(pIPAddress, 0, nIPAddressSize);
+               cpe_control_strncpy_s(pIPAddress, nIPAddressSize, pTmpIP, strlen(pTmpIP));
+
+               break;
+            }
+         }
+
+         if (bFound == DSL_TRUE)
+            break;
+      }
+   }
+
+   if (bAnyFound || bFound)
+   {
+      retVal = DSL_TRUE;
+   }
+
+   freeifaddrs(pIfaddr);
 
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      DSL_CPE_PREFIX"OUT - DSL_CPE_DebugAndTestInterfaceIPGet" DSL_CPE_CRLF));
+
+   return retVal;
+}
+#endif /* defined(DSL_DEBUG_TOOL_INTERFACE) || defined(INCLUDE_DSL_CPE_DTI_SUPPORT) */
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
+#ifndef RTEMS
 /**
-   Termination handler. Will clean up in case of ctrl-c.
+   Signal handler.
 
    \param sig signal number
 */
-DSL_CPE_STATIC  void DSL_CPE_TerminationHandler (
+DSL_CPE_STATIC void DSL_CPE_SignalHandler (
    DSL_int_t sig)
 {
-#ifndef RTEMS
-   /* ignore the signal, we'll handle by ourself */
-   signal (sig, SIG_IGN);
-
    if (sig == SIGINT)
    {
-      DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX "terminated" DSL_CPE_CRLF));
-      DSL_CPE_Termination ();
+      /* handle this signal just once */
+      signal (sig, SIG_IGN);
+
+      DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+         "SIGINT received" DSL_CPE_CRLF));
+      DSL_CPE_Interruption();
+   }
+   else if (sig == SIGTERM)
+   {
+      /* handle this signal just once */
+      signal (sig, SIG_IGN);
+
+      DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+         "SIGTERM received" DSL_CPE_CRLF));
+      DSL_CPE_Termination();
+   }
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+   else if (sig == SIGHUP)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+         "SIGHUP received" DSL_CPE_CRLF));
+      DSL_CPE_Reconfiguration();
+   }
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+   else
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - Received unsupported signal<%d>!" DSL_CPE_CRLF,
+         sig));
    }
-#endif /* RTEMS*/
 }
+#endif /* RTEMS*/
 
-DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termination (void)
+DSL_CPE_STATIC DSL_void_t DSL_CPE_DaemonExit(void)
 {
-#ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
-   DSL_int_t nDevice = 0;
-   DSL_char_t buf[32] = "quit";
-#endif
-
    DSL_CPE_Control_Context_t *pCtrlCtx;
 
    pCtrlCtx = DSL_CPE_GetGlobalContext();
@@ -6625,20 +6941,87 @@ DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termination (void)
    {
       pCtrlCtx->bRun = DSL_FALSE;
    }
+}
 
 #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
+DSL_CPE_STATIC  DSL_void_t DSL_CPE_CLI_Quit(void)
+{
+   DSL_int_t nDevice = 0;
+   DSL_char_t buf[32] = "quit";
+
    for (nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; nDevice++)
    {
       /* quit via the CLI */
-      DSL_CPE_CLI_CommandExecute (DSL_CPE_GetGlobalContext()->fd[nDevice], buf, DSL_NULL,
-         DSL_CPE_STDERR);
+      DSL_CPE_CLI_CommandExecute(DSL_CPE_GetGlobalContext()->fd[nDevice],
+         buf, DSL_NULL, DSL_CPE_STDERR);
    }
 
    DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
       "CLI interface of DSL CPE API terminated." DSL_CPE_CRLF));
+}
+#endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
+
+DSL_CPE_STATIC  DSL_void_t DSL_CPE_Interruption(void)
+{
+   DSL_CPE_DaemonExit();
+
+#ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
+   DSL_CPE_CLI_Quit();
 #endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
 }
 
+DSL_CPE_STATIC  DSL_void_t DSL_CPE_Termination(void)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_int_t nDevice = 0;
+   DSL_AutobootControl_t sAutobootCtl;
+
+   memset(&sAutobootCtl, 0, sizeof(DSL_AutobootControl_t));
+
+   sAutobootCtl.data.nCommand = DSL_AUTOBOOT_CTRL_STOP_PD;
+
+   for (nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; nDevice++)
+   {
+      nRet = (DSL_Error_t)DSL_CPE_Ioctl(
+         DSL_CPE_GetGlobalContext()->fd[nDevice],
+         DSL_FIO_AUTOBOOT_CONTROL_SET, (DSL_int_t)&sAutobootCtl);
+
+      if (nRet < DSL_SUCCESS)
+      {
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+            "Autoboot Power Down for device (%d) failed!, nRet = %d!"
+            DSL_CPE_CRLF, nDevice, sAutobootCtl.accessCtl.nReturn));
+      }
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "Autoboot power down executed" DSL_CPE_CRLF));
+
+   /* wait until autoboot do its job */
+   DSL_CPE_Sleep(1);
+
+   DSL_CPE_DaemonExit();
+
+#ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
+   DSL_CPE_CLI_Quit();
+#endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
+}
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+DSL_CPE_STATIC  DSL_void_t DSL_CPE_Reconfiguration(void)
+{
+   DSL_CPE_Control_Context_t *pCtrlCtx;
+
+   pCtrlCtx = DSL_CPE_GetGlobalContext();
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "Reloading configuration..." DSL_CPE_CRLF));
+
+   /* read configuration file and apply params */
+   DSL_CPE_ConfigUpdate(pCtrlCtx);
+}
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
 /**
    Control application for the DSL CPE driver.
 
@@ -6654,7 +7037,8 @@ DSL_int_t dsl_cpe_daemon (
 {
    DSL_int_t ret = 0;
    DSL_char_t device[128] = "";
-   DSL_int_t fd = 0, i = 0, nDevice = 0;
+   DSL_char_t *lockPath = "/tmp/.dsl_cpe_control.lock";
+   DSL_int_t fd = 0, i = 0, nDevice = 0, lockFd = 0;
    DSL_int_t nSysIfCfgSize = 0;
 #ifndef DSL_CPE_DEBUG_DISABLE
    DSL_DBG_ModuleLevel_t nDbgModLvl;
@@ -6673,6 +7057,20 @@ DSL_int_t dsl_cpe_daemon (
    DSL_ResourceUsageStatistics_t pDrvResStatData;
 #endif /* INCLUDE_DSL_RESOURCE_STATISTICS*/
 #endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+   const DSL_Configuration_t *pConfig = DSL_NULL;
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
+   /* Prevents multiple instances of DSL Control Application */
+   lockFd = open(lockPath, O_CREAT);
+
+   if (flock(lockFd, LOCK_EX | LOCK_NB) < DSL_SUCCESS)
+   {
+      DSL_CPE_FPrintf (DSL_CPE_STDOUT,
+         DSL_CPE_PREFIX"stopping DSL CPE Control Application, another instance found!" DSL_CPE_CRLF);
+      return DSL_ERROR;
+   }
+
    DSL_CPE_ArgParseLayout(argc, argv);
 
 #if defined(RTEMS) && defined(INCLUDE_DSL_CPE_CLI_SUPPORT)
@@ -6683,7 +7081,6 @@ DSL_int_t dsl_cpe_daemon (
 #endif /* defined(RTEMS) && defined(INCLUDE_DSL_CPE_CLI_SUPPORT)*/
 
    memset (pCtrlCtx, 0x00, sizeof (DSL_CPE_Control_Context_t));
-   memset(&instanceConfig, 0x0, sizeof(DSL_InstanceControl_t));
 #ifndef DSL_CPE_DEBUG_DISABLE
    memset(&nDbgModLvl, 0x0, sizeof(DSL_DBG_ModuleLevel_t));
 #endif /* DSL_CPE_DEBUG_DISABLE */
@@ -6730,21 +7127,175 @@ DSL_int_t dsl_cpe_daemon (
    g_sFirmwareName2 = DSL_CPE_Malloc(strlen(sDefaultFirmwareName2) + 1);
    if(g_sFirmwareName1)
    {
-      strcpy(g_sFirmwareName1, sDefaultFirmwareName1);
+      memset(g_sFirmwareName1, 0, strlen(sDefaultFirmwareName1) + 1);
+      cpe_control_strncpy_s(g_sFirmwareName1, strlen(sDefaultFirmwareName1) + 1,
+         sDefaultFirmwareName1, strlen(sDefaultFirmwareName1));
    }
    if(g_sFirmwareName2)
    {
-      strcpy(g_sFirmwareName2, sDefaultFirmwareName2);
+      memset(g_sFirmwareName2, 0, strlen(sDefaultFirmwareName2) + 1);
+      cpe_control_strncpy_s(g_sFirmwareName2, strlen(sDefaultFirmwareName2) + 1,
+         sDefaultFirmwareName2, strlen(sDefaultFirmwareName2));
    }
-   
+
    if (DSL_CPE_UpdateLayoutConfiguration() == DSL_FALSE)
    {
       ret = DSL_ERROR;
       goto DSL_CPE_CONTROL_EXIT;
    }
    DSL_CPE_ArgParse (argc, argv);
-   
-      
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+   (DSL_void_t)DSL_CPE_ConfigInit();
+   (DSL_void_t)DSL_CPE_ConfigGet(&pConfig);
+   /* Take init configuration into use */
+   if (pConfig != DSL_NULL)
+   {
+      g_MultimodeFsmConfig.nNextMode =
+         pConfig->data.sStartupInitConfig.nNextMode;
+      g_nDevices = pConfig->data.sStartupInitConfig.nMaxDeviceNumber;
+      g_nLines = pConfig->data.sStartupInitConfig.nLinesPerDevice;
+      g_nChannels = pConfig->data.sStartupInitConfig.nChannelsPerLine;
+
+      g_ActivationFsmConfig.nActivationSequence =
+         pConfig->data.sCommonConfig.ActSeq;
+      g_ActivationFsmConfig.nActivationMode =
+         pConfig->data.sCommonConfig.ActMode;
+      g_RememberFsmConfig =
+         pConfig->data.sCommonConfig.Remember;
+
+      /* kept in a separate block to reduce memory consumption */
+      {
+#if defined(DSL_DEBUG_TOOL_INTERFACE) || defined(INCLUDE_DSL_CPE_DTI_SUPPORT)
+      DSL_boolean_t bDisableDebugAndTestInterfaces = DSL_TRUE;
+
+      /* big enough to store any IPv4 address */
+      DSL_char_t ipAddress[16] = "0.0.0.0";
+      const DSL_char_t *pPreferredNetIfs[] =
+      {
+         "br-lan",
+         "br0",
+         "eth0",
+         "eth0_1",
+      };
+
+      /* Try to find IP for network interface from preferred list */
+      if (pConfig->data.sDebuggingConfig.nDebugAndTestInterfaces == 1)
+      {
+         if (DSL_CPE_DebugAndTestInterfaceIPGet(
+               pPreferredNetIfs, sizeof(pPreferredNetIfs)/sizeof(pPreferredNetIfs[0]),
+               ipAddress, sizeof(ipAddress)))
+         {
+            bDisableDebugAndTestInterfaces = DSL_FALSE;
+         }
+         else
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - Test and debug interfaces could not be bound to LAN ports!!!" DSL_CPE_CRLF));
+         }
+      }
+      /* Set network interface IP to 0.0.0.0 ("any IPv4 address") */
+      else if (pConfig->data.sDebuggingConfig.nDebugAndTestInterfaces == 2)
+      {
+         bDisableDebugAndTestInterfaces = DSL_FALSE;
+      }
+#endif
+
+/* Configure Debug Tool Interface socket based on read config param and found IP */
+#ifdef DSL_DEBUG_TOOL_INTERFACE
+      if (bDisableDebugAndTestInterfaces == DSL_TRUE)
+      {
+         bTcpMessageIntf = 0;
+
+         if(g_sTcpMessagesSocketAddr != DSL_NULL)
+         {
+            DSL_CPE_Free (g_sTcpMessagesSocketAddr);
+            g_sTcpMessagesSocketAddr = DSL_NULL;
+         }
+
+         g_nTcpMessagesSocketPort = 0;
+         g_bEnableTcpCli = DSL_FALSE;
+      }
+      else
+      {
+         bTcpMessageIntf = 1;
+
+         if (g_sTcpMessagesSocketAddr)
+         {
+            DSL_CPE_Free(g_sTcpMessagesSocketAddr);
+         }
+
+         g_sTcpMessagesSocketAddr = DSL_CPE_Malloc(sizeof(ipAddress));
+         if (g_sTcpMessagesSocketAddr)
+         {
+            memset(g_sTcpMessagesSocketAddr, 0, sizeof(ipAddress));
+            cpe_control_strncpy_s(g_sTcpMessagesSocketAddr, sizeof(ipAddress), ipAddress, sizeof(ipAddress));
+         }
+
+         g_nTcpMessagesSocketPort = DSL_CPE_TCP_MESSAGES_PORT;
+         g_bEnableTcpCli = DSL_CPE_ENABLE_TCP_CLI_DEFAULT;
+
+         DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+            "TCP messages debug server config: using <%s> IP address." DSL_CPE_CRLF,
+            ipAddress));
+      }
+#endif /* DSL_DEBUG_TOOL_INTERFACE */
+
+/* Configure DTI socket based on read config param and found IP */
+#if defined(INCLUDE_DSL_CPE_DTI_SUPPORT)
+      if (bDisableDebugAndTestInterfaces == DSL_TRUE)
+      {
+         bDTI = 0;
+
+         if(sDtiSocketAddr != DSL_NULL)
+         {
+            DSL_CPE_Free (sDtiSocketAddr);
+            sDtiSocketAddr = DSL_NULL;
+         }
+      }
+      else
+      {
+         bDTI = 1;
+
+         if (sDtiSocketAddr)
+         {
+            DSL_CPE_Free(sDtiSocketAddr);
+         }
+
+         sDtiSocketAddr = DSL_CPE_Malloc(sizeof(ipAddress));
+         if (sDtiSocketAddr)
+         {
+            memset(sDtiSocketAddr, 0, sizeof(ipAddress));
+            cpe_control_strncpy_s(sDtiSocketAddr, sizeof(ipAddress), ipAddress, sizeof(ipAddress));
+         }
+
+         DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+            "DTI Agent config: using <%s> IP address." DSL_CPE_CRLF,
+            ipAddress));
+      }
+#endif /* defined(INCLUDE_DSL_CPE_DTI_SUPPORT) */
+      }
+
+   }
+   else
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_Configuration_t is empty!" DSL_CPE_CRLF));
+   }
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "Startup init config: devices=%d lines=%d channels=%d next_mode=%d" DSL_CPE_CRLF,
+      g_nDevices,
+      g_nLines,
+      g_nChannels,
+      g_MultimodeFsmConfig.nNextMode));
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "Activation config: sequence=%d mode=%d remember=%d" DSL_CPE_CRLF,
+      g_ActivationFsmConfig.nActivationSequence,
+      g_ActivationFsmConfig.nActivationMode,
+      g_RememberFsmConfig));
 
    /* display version */
    if (bGetVersion != -1)
@@ -6858,16 +7409,20 @@ DSL_int_t dsl_cpe_daemon (
 #endif /* LINUX */
 
 #ifndef RTEMS
-   signal (SIGINT, DSL_CPE_TerminationHandler);
+   signal(SIGINT, DSL_CPE_SignalHandler);
+   signal(SIGTERM, DSL_CPE_SignalHandler);
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+   signal (SIGHUP, DSL_CPE_SignalHandler);
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
 #endif /* RTEMS*/
 
    /* Open DSL_CPE_MAX_DSL_ENTITIES devices*/
    for (nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; nDevice++)
    {
 #if defined(INCLUDE_DSL_CPE_API_VRX)
-      sprintf (device, "%s/%d", DSL_CPE_DEVICE_NAME, nDevice);
+      snprintf(device, sizeof(device), "%s/%d", DSL_CPE_DEVICE_NAME, nDevice);
 #else
-      sprintf (device, "%s", DSL_CPE_DEVICE_NAME);
+      snprintf(device, sizeof(device), "%s", DSL_CPE_DEVICE_NAME);
 #endif /* defined(INCLUDE_DSL_CPE_API_VRX)*/
 
       fd = DSL_CPE_Open (device);
@@ -7043,6 +7598,7 @@ DSL_int_t dsl_cpe_daemon (
    /* Configure event and resource handling*/
    for (nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; nDevice++)
    {
+      memset(&instanceConfig, 0x0, sizeof(DSL_InstanceControl_t));
       instanceConfig.data.bEventActivation = bEventActivation;
       instanceConfig.data.nResourceActivationMask =
          (DSL_BF_ResourceActivationType_t)nResourceActivationMask;
@@ -7054,7 +7610,7 @@ DSL_int_t dsl_cpe_daemon (
       {
          DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX "Could not configure "
             "event handling for device %d (%d)." DSL_CPE_CRLF,
-            i, instanceConfig.accessCtl.nReturn));
+            nDevice, instanceConfig.accessCtl.nReturn));
       }
    }
 
@@ -7115,7 +7671,7 @@ DSL_int_t dsl_cpe_daemon (
             if (ret < 0)
             {
                DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX "Could not unmask "
-                  "event(%d) for device %d (%d)!" DSL_CPE_CRLF, i, nDevice, instanceConfig.accessCtl.nReturn));
+                  "event(%d) for device %d (%d)!" DSL_CPE_CRLF, i, nDevice, statusEventMaskCfgSet.accessCtl.nReturn));
             }
          }
       }
@@ -7262,6 +7818,81 @@ DSL_int_t dsl_cpe_daemon (
 #endif /* INCLUDE_DSL_RESOURCE_STATISTICS*/
 #endif /* INCLUDE_DSL_CPE_CLI_SUPPORT */
 
+   /* Any steps towards SDL compliance
+      should be performed before this block */
+   {
+      /* Wait max 10 seconds for FW download finish
+         before trying to update configuration and start Autoboot */
+      DSL_FirmwareDownloadStatus_t sFdsg;
+      DSL_uint8_t nFwDwTimeoutSec;
+
+      for (nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; ++nDevice)
+      {
+         nFwDwTimeoutSec = g_nDefaultFWDownloadTimeoutSec;
+         while(nFwDwTimeoutSec > 0)
+         {
+            memset(&sFdsg, 0x0, sizeof(DSL_FirmwareDownloadStatus_t));
+
+            ret = DSL_CPE_Ioctl(pCtrlCtx->fd[nDevice],
+                                DSL_FIO_FIRMWARE_DOWNLOAD_STATUS_GET, (DSL_int_t) &sFdsg);
+
+            if (ret == 0 && sFdsg.data.nStatus == DSL_FW_DWNLD_STATUS_READY)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+                  "Device[%d] firmware ready." DSL_CPE_CRLF,
+                  nDevice));
+               break;
+            }
+            else
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+                  "Device[%d] firmware not ready yet after %d. sec "
+                  "(status = %d, return code = %d)." DSL_CPE_CRLF,
+                  nDevice,
+                  (g_nDefaultFWDownloadTimeoutSec - nFwDwTimeoutSec + 1),
+                  sFdsg.data.nStatus, ret));
+
+               DSL_CPE_Sleep (1);
+               --nFwDwTimeoutSec;
+            }
+         }
+
+         if (nFwDwTimeoutSec == 0)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "Device[%d] firmware still not ready after %d seconds!" DSL_CPE_CRLF,
+               nDevice, g_nDefaultFWDownloadTimeoutSec));
+         }
+      }
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+      /* apply initialized configuration */
+      if (DSL_CPE_ConfigUpdate(pCtrlCtx) == DSL_ERROR)
+      {
+         goto DSL_CPE_CONTROL_EXIT;
+      }
+
+      DSL_AutobootControl_t sAcs;
+
+      for (nDevice = 0; nDevice < DSL_CPE_DSL_ENTITIES; ++nDevice)
+      {
+         memset(&sAcs,0x0, sizeof(DSL_AutobootControl_t));
+
+         sAcs.data.nCommand = DSL_AUTOBOOT_CTRL_START;
+
+         ret = DSL_CPE_Ioctl(pCtrlCtx->fd[nDevice],
+                                DSL_FIO_AUTOBOOT_CONTROL_SET, (DSL_int_t) &sAcs);
+
+         if (ret != 0)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+               "Device[%d] autoboot start returned code = %d." DSL_CPE_CRLF,
+               nDevice, ret));
+         }
+      }
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+   }
+
 #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
 #ifndef DSL_CPE_REMOVE_PIPE_SUPPORT
    if (DSL_CPE_Pipe_Init (pCtrlCtx) == DSL_ERROR)
@@ -7281,7 +7912,7 @@ DSL_int_t dsl_cpe_daemon (
          {
             if (pCtrlCtx->bRun)
             {
-               DSL_CPE_Termination ();
+               DSL_CPE_Interruption ();
             }
             break;
          }
@@ -7364,7 +7995,7 @@ DSL_CPE_CONTROL_EXIT:
             if (ret < 0)
             {
                DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX "Could not nmask "
-                  "event(%d) for device %d (%d)!" DSL_CPE_CRLF, i, nDevice, instanceConfig.accessCtl.nReturn));
+                  "event(%d) for device %d (%d)!" DSL_CPE_CRLF, i, nDevice, statusEventMaskCfgSet.accessCtl.nReturn));
             }
          }
       }
diff --git a/src/dsl_cpe_control.h b/src/dsl_cpe_control.h
index a236298bfde261e76e3430a827525d0ddd9f8b22..8720d8a0faaf762372b068ffb3a94889a659493f 100644
--- a/src/dsl_cpe_control.h
+++ b/src/dsl_cpe_control.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -53,11 +55,18 @@ extern DSL_FirmwareFeatures_t g_nFwFeatures2;
 extern DSL_uint8_t g_nDevices;
 extern DSL_uint8_t g_nLines;
 extern DSL_uint8_t g_nChannels;
-/* Maximum lines per DSL device to support */
 
+/* Maximum lines per DSL device to support */
 #define DSL_CPE_LINES_PER_DEVICE ((const DSL_uint8_t) g_nLines)
+/* Maximum channels per line */
+#define DSL_CPE_CHANNELS_PER_LINE ((const DSL_uint8_t) g_nChannels)
+/* Configured number of devices */
 #define DSL_CPE_DEVICE_NUMBER ((const DSL_uint8_t) g_nDevices)
+/* Number of entries in the "bonding_group" table */
+#define DSL_CPE_BND_GROUP_ENTRIES 0 /* currently not supported */
+/* Bonding flag */
 #define INCLUDE_DSL_BONDING (g_nLines * g_nDevices > 1)
+/* Maximum number of devices */
 #define DSL_CPE_DSL_ENTITIES (g_nLines * g_nDevices)
 
 #define DSL_CPE_MAX_DEVICE_NUMBER 2
@@ -106,6 +115,7 @@ system support enabled only"
 #include "drv_dsl_cpe_api.h"
 #include "drv_dsl_cpe_api_types.h"
 #include "drv_dsl_cpe_api_error.h"
+#include "dsl_cpe_safec_wrapper.h"
 
 #ifdef INCLUDE_DSL_CPE_CLI_SUPPORT
    #include "dsl_cpe_cli.h"
diff --git a/src/dsl_cpe_debug.c b/src/dsl_cpe_debug.c
index b4f777fb48bf7512fa4f993c88e4aa00f893ebda..24a9901bfbc57348df9b883f778c04ba5f7de273 100644
--- a/src/dsl_cpe_debug.c
+++ b/src/dsl_cpe_debug.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -117,7 +119,8 @@ void DSL_CMV_Prepare (
    if ((opcode == DSL_CMV_OPCODE_H2D_CMV_WRITE) ||
        (opcode == DSL_CMV_OPCODE_H2D_DEBUG_WRITE_DM))
    {
-      memcpy (&(Message[4]), data, (DSL_uint32_t)(size * 2));
+      cpe_control_memcpy_s(&(Message[4]), (DSL_uint32_t)(size * 2),
+         data, (DSL_uint32_t)(size * 2));
    }
 
    return;
@@ -173,7 +176,7 @@ DSL_Error_t DSL_CMV_Read (
       return DSL_ERROR;
    }
 
-   memcpy(pData, &(Message[4]), (DSL_uint32_t)(size * 2));
+   cpe_control_memcpy_s(pData, (DSL_uint32_t)(size * 2), &(Message[4]), (DSL_uint32_t)(size * 2));
 
    return msg.accessCtl.nReturn;
 #else
@@ -481,7 +484,7 @@ DSL_int_t DSL_CPE_TcpDebugMessageHandle (DSL_CPE_Thread_Params_t *params )
          while(1)
          {
             /* Update the local file descriptor by the copy in the task parameter  */
-            memcpy(&tempFds,&readFds,sizeof(DSL_CPE_fd_set_t));
+            cpe_control_memcpy_s(&tempFds, sizeof(DSL_CPE_fd_set_t), &readFds, sizeof(readFds));
 
             /* Wait for incoming events */
             n = DSL_CPE_Select(width, &tempFds,
@@ -622,7 +625,9 @@ DSL_Error_t DSL_CPE_TcpDebugMessageIntfStart (
       g_sTcpMessagesSocketAddr = DSL_CPE_Malloc(strlen (sTcpServerIp) + 1);
       if (g_sTcpMessagesSocketAddr)
       {
-         strcpy (g_sTcpMessagesSocketAddr, sTcpServerIp);
+         memset(g_sTcpMessagesSocketAddr, 0, strlen (sTcpServerIp) + 1);
+         cpe_control_strncpy_s(g_sTcpMessagesSocketAddr, strlen (sTcpServerIp) + 1,
+            sTcpServerIp, strlen (sTcpServerIp));
       }
    }
 
@@ -888,7 +893,8 @@ DSL_int_t DSL_CPE_TcpDebugCliHandle ( DSL_CPE_Thread_Params_t *params )
          while(1)
          {
             /* Update the local file descriptor by the copy in the task parameter  */
-            memcpy(&tempFds, &readFds, sizeof(DSL_CPE_fd_set_t));
+            cpe_control_memcpy_s(&tempFds, sizeof(DSL_CPE_fd_set_t), 
+               &readFds, sizeof(readFds));
 
             /* Wait for incoming events */
             n = DSL_CPE_Select(nWidth, &tempFds,
diff --git a/src/dsl_cpe_debug_vrx.c b/src/dsl_cpe_debug_vrx.c
index cf09456a1d0f4f76c4420dd0dfa7aad832e4b7c2..85f7cc458663d0ecd9f6ae507ff4c3a06eedbd72 100644
--- a/src/dsl_cpe_debug_vrx.c
+++ b/src/dsl_cpe_debug_vrx.c
@@ -1,5 +1,7 @@
 /******************************************************************************
 
+                     Copyright 2018, Intel Corporation
+
                           Copyright (c) 2007-2015
                      Lantiq Beteiligungs-GmbH & Co. KG
 
@@ -305,7 +307,7 @@ static DSL_int_t DSL_CPE_VRX_MailboxSend(
       DSL_CCA_DEBUG (DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
          "Send to mailbox successful"DSL_CPE_CRLF));
 
-      memcpy(pCmvMsg, &CmvMsg_Ack, CMV_MESSAGE_SIZE);
+      cpe_control_memcpy_s(pCmvMsg, CMV_MESSAGE_SIZE, &CmvMsg_Ack, CMV_MESSAGE_SIZE);
    }
 
 
@@ -777,14 +779,16 @@ static DSL_int_t DSL_CPE_VRX_ReadDebug(
          case CMV_MSG_BIT_SIZE_8BIT:
             /* tmpData = WH_SWAP_HOST32_TARGET8(tmpData); */
 
-            memcpy(pDest, &pTmp[destAddr & 0x00000003], (DSL_uint32_t)tmpCnt);
+            cpe_control_memcpy_s(pDest, (DSL_uint32_t)tmpCnt,
+                  &pTmp[destAddr & 0x00000003], (DSL_uint32_t)tmpCnt);
             break;
          case CMV_MSG_BIT_SIZE_16BIT:
             /*
             tmpData = WH_SWAP_HOST32_TARGET16(tmpData);
             */
             /* address has to be 16 bit aligned --> only 0x00 or 0x02 */
-            memcpy(pDest, &pTmp[destAddr & 0x00000003], (DSL_uint32_t)tmpCnt);
+            cpe_control_memcpy_s(pDest, (DSL_uint32_t)tmpCnt,
+                  &pTmp[destAddr & 0x00000003], (DSL_uint32_t)tmpCnt);
             break;
          case CMV_MSG_BIT_SIZE_32BIT:
             /* no swap necessary */
@@ -854,7 +858,7 @@ static DSL_int_t DSL_CPE_VRX_ReadDebug(
       }
 
       /* copy received data */
-      memcpy(pDest, buffer.params_8Bit, (DSL_uint32_t)(tmpCnt));
+      cpe_control_memcpy_s(pDest, (DSL_uint32_t)(tmpCnt), buffer.params_8Bit, sizeof(buffer.params_8Bit));
       pDest += tmpCnt;
       destAddr += ((DSL_uint32_t)tmpCnt);
       remainCnt_byte -= tmpCnt;
@@ -886,17 +890,20 @@ static DSL_int_t DSL_CPE_VRX_ReadDebug(
       {
          case CMV_MSG_BIT_SIZE_8BIT:
             {
-               memcpy(pDest, &pTmp[0], (DSL_uint32_t)remainCnt_byte);
+                  cpe_control_memcpy_s(pDest, (DSL_uint32_t)remainCnt_byte, 
+                        &pTmp[0], (DSL_uint32_t)remainCnt_byte);
             }
             break;
          case CMV_MSG_BIT_SIZE_16BIT:
             /* the high word will be cached by the "CAT" section */
-            memcpy(pDest, &pTmp[0], (DSL_uint32_t)remainCnt_byte);
+            cpe_control_memcpy_s(pDest, (DSL_uint32_t)remainCnt_byte,
+                  &pTmp[0], (DSL_uint32_t)remainCnt_byte);
             break;
          case CMV_MSG_BIT_SIZE_32BIT:
             /* no swap necessary */
             tmpData = TCP_DEBUG_SWAP_HOST32_TARGET32(tmpData);
-            memcpy(pDest, &pTmp[0], (DSL_uint32_t)remainCnt_byte);
+            cpe_control_memcpy_s(pDest, (DSL_uint32_t)remainCnt_byte,
+                  &pTmp[0], (DSL_uint32_t)remainCnt_byte);
             break;
          default:
             goto RESPONSE_ERROR;
@@ -1014,21 +1021,24 @@ static DSL_int_t DSL_CPE_VRX_WriteDebug(
       /* get cat source data --> modify write data */
       pTmp = ((DSL_char_t *)&tmpData);
       pTmpSrc = ((DSL_char_t *)&tmpSrc);
-      memcpy(pTmpSrc, pSrc, (DSL_uint32_t)tmpCnt);
+      cpe_control_memcpy_s(pTmpSrc, (DSL_uint32_t)tmpCnt,
+            pSrc, (DSL_uint32_t)tmpCnt);
 
       /* receive msg is 16 bit target aligened --> data as 32 bit host value */
       switch(CMV_MSGHDR_BIT_SIZE_GET(pCmvMsg->cmv))
       {
          case CMV_MSG_BIT_SIZE_8BIT:
             tmpSrc = TCP_DEBUG_SWAP_TARGET8_HOST32(tmpSrc);
-            memcpy(&pTmp[destAddr & 0x00000003], pTmpSrc, (DSL_uint32_t)tmpCnt);
+            cpe_control_memcpy_s(&pTmp[destAddr & 0x00000003], (DSL_uint32_t)tmpCnt,
+                  pTmpSrc, (DSL_uint32_t)tmpCnt);
 
             break;
          case CMV_MSG_BIT_SIZE_16BIT:
             /*
             tmpSrc = WH_SWAP_TARGET16_HOST32(tmpSrc);
             */
-            memcpy(&pTmp[destAddr & 0x00000003], pTmpSrc, (DSL_uint32_t)tmpCnt);
+            cpe_control_memcpy_s(&pTmp[destAddr & 0x00000003], (DSL_uint32_t)tmpCnt,
+                  pTmpSrc, (DSL_uint32_t)tmpCnt);
             break;
          case CMV_MSG_BIT_SIZE_32BIT:
             /* no swap necessary */
@@ -1067,7 +1077,8 @@ static DSL_int_t DSL_CPE_VRX_WriteDebug(
          "Debug Write - 32 bit aligned (addr 0x%X, tmpCnt %d, remain %d)"DSL_CPE_CRLF,
          destAddr, tmpCnt, remainCnt_byte));
 
-      memcpy(&buffer, pSrc, (DSL_uint32_t)tmpCnt);
+      cpe_control_memcpy_s(&buffer, sizeof(CMV_DEBUG_ACCESS_BUFFER_T),
+         pSrc, (DSL_uint32_t)tmpCnt);
 
       /* receive data as 32 bit value --> swap to the corresponding target */
       switch(CMV_MSGHDR_BIT_SIZE_GET(pCmvMsg->cmv))
@@ -1140,7 +1151,7 @@ static DSL_int_t DSL_CPE_VRX_WriteDebug(
       /* get cat source data --> modify write data */
       pTmp = ((DSL_char_t *)&tmpData);
       pTmpSrc = ((DSL_char_t *)&tmpSrc);
-      memcpy(pTmpSrc, pSrc, remainCnt_byte);
+      cpe_control_memcpy_s(pTmpSrc, remainCnt_byte, pSrc, remainCnt_byte);
 
       /* receive msg is 16 bit target aligened --> data as 32 bit host value */
       switch(CMV_MSGHDR_BIT_SIZE_GET(pCmvMsg->cmv))
@@ -1156,7 +1167,7 @@ static DSL_int_t DSL_CPE_VRX_WriteDebug(
             goto RESPONSE_WR_ERROR;
       }
 
-      memcpy(pTmp, pTmpSrc, remainCnt_byte);
+      cpe_control_memcpy_s(pTmp, remainCnt_byte, pTmpSrc, remainCnt_byte);
 
       vdsl2_dbg_access.count     = 1;
       vdsl2_dbg_access.pData_32  = (unsigned int *) &tmpData;
@@ -1268,7 +1279,8 @@ static DSL_int_t DSL_CPE_VRX_MsgHandle(
    DSL_uint32_t mbxCode;
    CMV_MESSAGE_ALL_T *pCmvMsg = &(pTcpDebugInfo->CmvMsg);
 
-   memcpy (pCmvMsg, pCmvMsgRecv, (DSL_uint32_t)CMVSizeByte);
+   cpe_control_memcpy_s(pCmvMsg, (DSL_uint32_t)CMVSizeByte,
+      pCmvMsgRecv, (DSL_uint32_t)CMVSizeByte);
 
    tmpChannel = CMV_MSGHDR_CODE_PORT_NUMBER_GET(pCmvMsg->cmv);
    /*tmpChannel = 0;*/
@@ -1621,7 +1633,7 @@ DSL_int_t DSL_CPE_DEV_TcpMessageHandle(
    tmp = (pTcpDebugInfo->pEndReceive - pPackage);
    if (tmp > 0)
    {
-      memcpy (pTcpDebugInfo->Buffer, pPackage, (DSL_uint32_t)tmp);
+      cpe_control_memcpy_s(pTcpDebugInfo->Buffer, (DSL_uint32_t)tmp, pPackage, (DSL_uint32_t)tmp);
    }
 
    pTcpDebugInfo->pEndReceive = pTcpDebugInfo->Buffer + tmp;
diff --git a/src/dsl_cpe_dti.c b/src/dsl_cpe_dti.c
index 595236cee03f9b5e0f58aac51014e21e211f49b8..5bf430473ba8d1afe423a6dc08b772f3126e16ed 100644
--- a/src/dsl_cpe_dti.c
+++ b/src/dsl_cpe_dti.c
@@ -1,5 +1,7 @@
 /******************************************************************************
 
+                     Copyright 2018, Intel Corporation
+
                           Copyright (c) 2007-2015
                      Lantiq Beteiligungs-GmbH & Co. KG
 
@@ -345,7 +347,7 @@ DSL_Error_t DSL_CPE_Dti_Start(
 #endif
 
       /* DTI IP Setup setup */
-      strncpy(AgentStartupSettingsXDevs.serverIpAddr, pDtiServerIp, 16);
+      cpe_control_strncpy_s(AgentStartupSettingsXDevs.serverIpAddr, 16, pDtiServerIp, strlen(pDtiServerIp));
       AgentStartupSettingsXDevs.serverIpAddr[15]='\0';
       AgentStartupSettingsXDevs.listenPort = (dtiListenPort == 0) ? 9000 : (IFX_uint16_t)dtiListenPort;
 
@@ -389,7 +391,7 @@ DSL_Error_t DSL_CPE_Dti_Start(
 
 
       /* DTI IP Setup setup */
-      strncpy(dtiStartup.serverIpAddr, pDtiServerIp, 16);
+      cpe_control_strncpy_s(dtiStartup.serverIpAddr, 16, pDtiServerIp, strlen(pDtiServerIp));
       dtiStartup.listenPort = (dtiListenPort == 0) ? 9000 : (IFX_uint16_t)dtiListenPort;
 
       /* DTI Agent configuration */
diff --git a/src/dsl_cpe_dti_vrx.c b/src/dsl_cpe_dti_vrx.c
index 0582e7676d6fddc52e62bc400939d82697169236..44e76a12e455642b06aae7bd3e17591688e1ba71 100644
--- a/src/dsl_cpe_dti_vrx.c
+++ b/src/dsl_cpe_dti_vrx.c
@@ -1,7 +1,8 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2011 - 2014 Lantiq Deutschland GmbH
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -15,7 +16,6 @@
 /* ============================================================================
    Includes
    ========================================================================= */
-#include "dti_osmap.h"
 #include "dsl_cpe_control.h"
 
 #if defined(INCLUDE_DSL_CPE_API_VRX)
@@ -55,15 +55,7 @@ typedef struct DTI_Connection_s
 /* ============================================================================
    Defines
    ========================================================================= */
-#ifdef DTI_STATIC
-#  undef DTI_STATIC
-#endif
-
-#ifdef DTI_DEBUG
-#  define DTI_STATIC
-#else
-#  define DTI_STATIC       static
-#endif
+#define DSL_CPE_STATIC       static
 
 #define VRX_IOCTL_ARG     unsigned long
 
@@ -92,37 +84,37 @@ typedef struct DTI_Connection_s
    Local Function Declaration
    ========================================================================= */
 
-DTI_STATIC IFX_int_t DTI_DevOpenByName(
+DSL_CPE_STATIC IFX_int_t DTI_DevOpenByName(
                         IFX_int_t      dev_num,
                         IFX_char_t     *pDevName);
 
-DTI_STATIC IFX_int_t DTI_DevCloseByFd(
+DSL_CPE_STATIC IFX_int_t DTI_DevCloseByFd(
                         IFX_int_t devFd);
                         
-DTI_STATIC IFX_int_t DTI_DevOpen(
+DSL_CPE_STATIC IFX_int_t DTI_DevOpen(
                         DTI_DEV_VrxDriverCtx_t      *pVrxDevCtx,
                         DTI_PacketError_t           *pPacketError,
                         IFX_int_t                   lineNum);
 
-DTI_STATIC IFX_int_t DTI_DevClose(
+DSL_CPE_STATIC IFX_int_t DTI_DevClose(
                         DTI_DEV_VrxDriverCtx_t      *pVrxDevCtx,
                         DTI_PacketError_t           *pPacketError,
                         IFX_int_t                   lineNum);
                         
-DTI_STATIC IFX_int_t DTI_configSet_AutoMsg(
+DSL_CPE_STATIC IFX_int_t DTI_configSet_AutoMsg(
                         DTI_DEV_VrxDriverCtx_t  *pVrxDevCtx,
                         DTI_H2D_DeviceConfigSet_t  *pInCfgSet,
                         DTI_D2H_DeviceConfigSet_t  *pOutCfgSet,
                         IFX_int_t                  lineNum,
                         DTI_PacketError_t          *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_configGet_AutoMsg(
+DSL_CPE_STATIC IFX_int_t DTI_configGet_AutoMsg(
                         DTI_DEV_VrxDriverCtx_t  *pVrxDevCtx,
                         IFX_int_t                  lineNum,
                         DTI_PacketError_t          *pPacketError);
 
 #ifndef DTI_DONT_USE_PROTEXT
-DTI_STATIC IFX_int_t DTI_autoMsgRecv(
+DSL_CPE_STATIC IFX_int_t DTI_autoMsgRecv(
                         DTI_DEV_VrxDriverCtx_t  *pVrxDevCtx,
                         const DTI_Connection_t     *pDtiCon,
                         IFX_int_t                  devIfNum,
@@ -132,12 +124,12 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
 #endif /* !DTI_DONT_USE_PROTEXT */
 
 #ifndef DTI_DONT_USE_PROTEXT
-DTI_STATIC IFX_void_t DTI_devFdClear(
+DSL_CPE_STATIC IFX_void_t DTI_devFdClear(
                         DTI_DEV_VrxDriverCtx_t  *pVrxDevCtx,
                         IFX_int_t                  lineNum);
 #endif /* !DTI_DONT_USE_PROTEXT */
 
-DTI_STATIC IFX_int_t DTI_configGet_MbSize(
+DSL_CPE_STATIC IFX_int_t DTI_configGet_MbSize(
                         DTI_DEV_VrxDriverCtx_t  *pVrxDevCtx,
                         IFX_int_t                  lineNum,
                         DTI_PacketError_t          *pPacketError);
@@ -146,54 +138,54 @@ DTI_STATIC IFX_int_t DTI_configGet_MbSize(
    Device Access Functions
    ========================================================================= */
 
-DTI_STATIC IFX_int_t DTI_VRX_PrintoutLevelSet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_PrintoutLevelSet(
                         IFX_int_t            newDbgLevel);
 
-DTI_STATIC IFX_int_t DTI_VRX_ModuleSetup(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_ModuleSetup(
                         DTI_DeviceSysInfo_t  *pDeviceSystemInfo,
                         DTI_DeviceCtx_t      **ppDtiDevCtx);
 
-DTI_STATIC IFX_int_t DTI_VRX_ModuleDelete(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_ModuleDelete(
                         DTI_DeviceSysInfo_t  *pDeviceSystemInfo,
                         DTI_DeviceCtx_t      **ppDtiDevCtx);
 
-DTI_STATIC IFX_int_t DTI_VRX_SystemInfoWrite(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_SystemInfoWrite(
                         DTI_DeviceSysInfo_t  *pDeviceSystemInfo,
                         IFX_char_t           *pSysInfoBuffer,
                         IFX_int_t            bufferSize);
 
-DTI_STATIC IFX_int_t DTI_VRX_Reset(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Reset(
                         DTI_DeviceCtx_t         *pDtiDevCtx,
                         DTI_H2D_DeviceReset_t   *pInDevReset,
                         DTI_D2H_DeviceReset_t   *pOutDevReset,
                         IFX_int_t               rstMaskSize_32,
                         DTI_PacketError_t       *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_Download(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Download(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_ProtocolServerCtx_t    *pDtiProtServerCtx,
                         DTI_H2D_DeviceDownload_t   *pInDevDownload,
                         DTI_D2H_DeviceDownload_t   *pOutDevDownload,
                         DTI_PacketError_t          *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_DeviceOpen(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_DeviceOpen(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         IFX_int_t            lineNum,
                         DTI_PacketError_t    *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_DeviceClose(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_DeviceClose(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         IFX_int_t            lineNum,
                         DTI_PacketError_t    *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_RegisterLock(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_RegisterLock(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_DeviceLock_t *pInLock,
                         DTI_D2H_DeviceLock_t *pOutLock,
                         IFX_int_t            lineNum,
                         DTI_PacketError_t    *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_RegisterGet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_RegisterGet(
                         DTI_DeviceCtx_t         *pDtiDevCtx,
                         DTI_H2D_RegisterGet_t   *pInRegGet,
                         DTI_D2H_RegisterGet_t   *pOutRegGet,
@@ -201,21 +193,21 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterGet(
                         IFX_uint32_t            *pOutPaylSize_byte,
                         DTI_PacketError_t       *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_RegisterSet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_RegisterSet(
                         DTI_DeviceCtx_t         *pDtiDevCtx,
                         DTI_H2D_RegisterSet_t   *pInRegSet,
                         IFX_int_t               inRegSetSize_Byte,
                         IFX_int_t               lineNum,
                         DTI_PacketError_t       *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_ConfigSet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_ConfigSet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_H2D_DeviceConfigSet_t  *pInCfgSet,
                         DTI_D2H_DeviceConfigSet_t  *pOutCfgSet,
                         IFX_int_t                  lineNum,
                         DTI_PacketError_t          *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_ConfigGet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_ConfigGet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_H2D_DeviceConfigGet_t  *pInCfgGet,
                         DTI_D2H_DeviceConfigGet_t  *pOutCfgGet,
@@ -223,7 +215,7 @@ DTI_STATIC IFX_int_t DTI_VRX_ConfigGet(
                         DTI_PacketError_t          *pPacketError);
                         
 #if (DTI_DEVICE_INTERFACE_VERSION) > (0x00000100)
-DTI_STATIC IFX_int_t DTI_VRX_Message8Send(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Message8Send(
                         DTI_DeviceCtx_t * pDtiDevCtx,
                         DTI_H2D_Message8_u *pInMsg8Send,
                         DTI_D2H_Message8_u *pOutMsg8Send, 
@@ -233,7 +225,7 @@ DTI_STATIC IFX_int_t DTI_VRX_Message8Send(
                         DTI_PacketError_t *pPacketError);
 #endif
 
-DTI_STATIC IFX_int_t DTI_VRX_Message16Send(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Message16Send(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_Message16_u  *pInMsg16Send,
                         DTI_D2H_Message16_u  *pOutMsg16Send,
@@ -242,7 +234,7 @@ DTI_STATIC IFX_int_t DTI_VRX_Message16Send(
                         IFX_int_t            *pOutPaylSize_byte,
                         DTI_PacketError_t    *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_Message32Send(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Message32Send(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_Message32_u  *pInMsg32Send,
                         DTI_D2H_Message32_u  *pOutMsg32Send,
@@ -251,25 +243,25 @@ DTI_STATIC IFX_int_t DTI_VRX_Message32Send(
                         IFX_int_t            *pOutPaylSize_byte,
                         DTI_PacketError_t    *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_TraceBufferConfigSet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_TraceBufferConfigSet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_H2D_TraceConfigSet_t   *pInTraceConfigSet,
                         DTI_D2H_TraceConfigSet_t   *pOutTraceConfigSet,
                         IFX_int_t                  lineNum,
                         DTI_PacketError_t          *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_TraceBufferReset(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_TraceBufferReset(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         IFX_int_t            lineNum,
                         DTI_PacketError_t    *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_TraceBufferStatusGet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_TraceBufferStatusGet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_D2H_TraceStatusGet_t   *pOutTraceStatusGet,
                         IFX_int_t                  lineNum,
                         DTI_PacketError_t          *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_H2D_TraceBufferGet_t   *pInTraceBufferGet,
                         DTI_Packet_t               **ppUsedDtiPacketOut,
@@ -278,7 +270,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
                         IFX_int_t                  *pTrBufReadSize_byte,
                         DTI_PacketError_t          *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_DebugRead(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_DebugRead(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_DebugRead_t  *pInDbgGet,
                         DTI_D2H_DebugRead_t  *pOutDbgGet,
@@ -286,7 +278,7 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugRead(
                         IFX_int_t            *pDbgReadCount,
                         DTI_PacketError_t    *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_DebugWrite(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_DebugWrite(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_DebugWrite_t *pInDbgSet,
                         IFX_uint32_t         *pOutDbgGet_nU,
@@ -294,14 +286,14 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugWrite(
                         IFX_int_t            *pDbgWriteCount,
                         DTI_PacketError_t    *pPacketError);
 
-DTI_STATIC IFX_int_t DTI_VRX_AutoMsgProcess(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_AutoMsgProcess(
                         DTI_DeviceCtx_t         *pDtiDevCtx,
                         const DTI_Connection_t  *pDtiCon,
                         IFX_uint32_t            devSelectWait_ms,
                         IFX_char_t              *pOutBuffer,
                         IFX_int_t               outBufferSize_byte);
 
-DTI_STATIC IFX_int_t DTI_VRX_WinEasyCiAccess(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_WinEasyCiAccess(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         IFX_int_t            lineNum,
                         const IFX_uint8_t    *pDataIn,
@@ -315,7 +307,7 @@ DTI_STATIC IFX_int_t DTI_VRX_WinEasyCiAccess(
    ========================================================================= */
 
 /* Create device debug module - user part */
-IFXOS_PRN_USR_MODULE_CREATE(DTI_VRX, DTI_PRN_LEVEL_HIGH);
+IFXOS_PRN_USR_MODULE_CREATE(DSL_CPE, DSL_PRN_LEVEL_HIGH);
 
 /**
    Collection of all available device access functions.
@@ -400,7 +392,7 @@ static DSL_int_t DTI_VrxDeviceStateCheck(
    if success, a valid device fd
    else IFX_ERROR.
 */
-DTI_STATIC IFX_int_t DTI_DevOpenByName(
+DSL_CPE_STATIC IFX_int_t DTI_DevOpenByName(
                         IFX_int_t      dev_num,
                         IFX_char_t     *pDevName)
 {
@@ -447,7 +439,7 @@ DTI_STATIC IFX_int_t DTI_DevOpenByName(
    If success IFX_SUCCESS else IFX_ERROR.
 
 */
-DTI_STATIC IFX_int_t DTI_DevCloseByFd(
+DSL_CPE_STATIC IFX_int_t DTI_DevCloseByFd(
                         IFX_int_t devFd)
 {
    IFX_int_t   retVal = IFX_ERROR;
@@ -460,7 +452,7 @@ DTI_STATIC IFX_int_t DTI_DevCloseByFd(
    return retVal;
 }
 
-DTI_STATIC IFX_int_t DTI_DevOpen(
+DSL_CPE_STATIC IFX_int_t DTI_DevOpen(
                         DTI_DEV_VrxDriverCtx_t      *pVrxDevCtx,
                         DTI_PacketError_t           *pPacketError,
                         IFX_int_t                   lineNum)
@@ -481,7 +473,7 @@ DTI_STATIC IFX_int_t DTI_DevOpen(
    return IFX_SUCCESS;
 }                        
 
-DTI_STATIC IFX_int_t DTI_DevClose(
+DSL_CPE_STATIC IFX_int_t DTI_DevClose(
                         DTI_DEV_VrxDriverCtx_t      *pVrxDevCtx,
                         DTI_PacketError_t           *pPacketError,
                         IFX_int_t                   lineNum)
@@ -515,7 +507,7 @@ DTI_STATIC IFX_int_t DTI_DevClose(
    -1 if something went wrong, else
    size of the mailbox
 */
-DTI_STATIC IFX_int_t DTI_configSet_AutoMsg(
+DSL_CPE_STATIC IFX_int_t DTI_configSet_AutoMsg(
                         DTI_DEV_VrxDriverCtx_t    *pVrxDevCtx,
                         DTI_H2D_DeviceConfigSet_t  *pInCfgSet,
                         DTI_D2H_DeviceConfigSet_t  *pOutCfgSet,
@@ -549,12 +541,12 @@ DTI_STATIC IFX_int_t DTI_configSet_AutoMsg(
 
       if (nfcChange == 1)
       {
-         DTI_MemSet(&drvIoCtl, 0x00, sizeof(drvIoCtl)); 
+         cpe_control_memset_s(&drvIoCtl, sizeof(drvIoCtl), 0x00, sizeof(drvIoCtl)); 
 
          if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
          {
-            DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-               ("ERROR: Vrx Config Set AutoMsg - device open error." DTI_CRLF));
+            DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+               ("ERROR: Vrx Config Set AutoMsg - device open error." DSL_CPE_CRLF));
 
             *pPacketError = DTI_eErrPortOpen;
             return IFX_ERROR;
@@ -565,8 +557,8 @@ DTI_STATIC IFX_int_t DTI_configSet_AutoMsg(
                      (pInCfgSet->value == 0) ? FIO_MEI_MBOX_NFC_DISABLE : FIO_MEI_MBOX_NFC_ENABLE, 
                      (DSL_int_t)&drvIoCtl)) < 0 )
          {
-            DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-               ("ERROR: Vrx Config Set AutoMsg - ioctl, NFC %s."DTI_CRLF,
+            DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+               ("ERROR: Vrx Config Set AutoMsg - ioctl, NFC %s."DSL_CPE_CRLF,
                  (pInCfgSet->value == 0) ? "disable" : "enable"));
 
             *pPacketError = DTI_eErrPortOperation;
@@ -590,8 +582,8 @@ DTI_STATIC IFX_int_t DTI_configSet_AutoMsg(
    else
 #endif /* !DTI_DONT_USE_PROTEXT */
    {   
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Cfg Set - Auto msg not supported."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Cfg Set - Auto msg not supported."DSL_CPE_CRLF));
 
       *pPacketError     = DTI_eErrConfiguration;
    }
@@ -613,7 +605,7 @@ DTI_STATIC IFX_int_t DTI_configSet_AutoMsg(
    1 if auto msg is enabled
    0 if auto msg is disabled
 */
-DTI_STATIC IFX_int_t DTI_configGet_AutoMsg(
+DSL_CPE_STATIC IFX_int_t DTI_configGet_AutoMsg(
                         DTI_DEV_VrxDriverCtx_t *pVrxDevCtx,
                         IFX_int_t               lineNum,
                         DTI_PacketError_t       *pPacketError)
@@ -654,7 +646,7 @@ DTI_STATIC IFX_int_t DTI_configGet_AutoMsg(
    lineNum        - line number
 
 */
-DTI_STATIC IFX_void_t DTI_devFdClear(
+DSL_CPE_STATIC IFX_void_t DTI_devFdClear(
                         DTI_DEV_VrxDriverCtx_t *pVrxDevCtx,
                         IFX_int_t               lineNum)
 {
@@ -667,7 +659,7 @@ DTI_STATIC IFX_void_t DTI_devFdClear(
    {
       if (pVrxDevCtx->pDevFd[i] >= 0)
       {
-         if ( (DTI_DevFdIsSet(pVrxDevCtx->pDevFds[i], &pVrxDevCtx->nfcDevFds)) &&
+         if ( (DSL_CPE_DevFdIsSet(pVrxDevCtx->pDevFds[i], &pVrxDevCtx->nfcDevFds)) &&
               (pVrxDevCtx->pDevFds[i] > maxDevFd) }
          {
             maxDevFd = pVrxDevCtx->pDevFds[i];
@@ -680,16 +672,16 @@ DTI_STATIC IFX_void_t DTI_devFdClear(
 #else
    IFX_int_t            i, maxDevFd = 0;
 
-   DTI_DevFdZero(&pVrxDevCtx->tmpDevFds);
+   DSL_CPE_FD_ZERO(&pVrxDevCtx->tmpDevFds);
    pVrxDevCtx->nfcMaxDevFd = 0;
 
    for (i = 0; i < pVrxDevCtx->numOfPorts; i++)
    {
       if ( (pVrxDevCtx->pDevFds[i] >= 0) && (i != lineNum))
       {
-         if ( DTI_DevFdIsSet((IFX_uint32_t)pVrxDevCtx->pDevFds[i], &pVrxDevCtx->nfcDevFds) )
+         if ( DSL_CPE_DevFdIsSet((IFX_uint32_t)pVrxDevCtx->pDevFds[i], &pVrxDevCtx->nfcDevFds) )
          {
-            DTI_DevFdSet((IFX_uint32_t)pVrxDevCtx->pDevFds[i], &pVrxDevCtx->tmpDevFds);
+            DSL_CPE_DevFdIsSet((IFX_uint32_t)pVrxDevCtx->pDevFds[i], &pVrxDevCtx->tmpDevFds);
 
             if (pVrxDevCtx->pDevFds[i] > maxDevFd)
             {
@@ -699,10 +691,10 @@ DTI_STATIC IFX_void_t DTI_devFdClear(
       }
    }
 
-   DTI_MemCpy(&pVrxDevCtx->nfcDevFds, &pVrxDevCtx->tmpDevFds, sizeof(IFXOS_devFd_set_t));
+   cpe_control_memcpy_s(&pVrxDevCtx->nfcDevFds, sizeof(pVrxDevCtx->nfcDevFds), &pVrxDevCtx->tmpDevFds, sizeof(IFXOS_devFd_set_t));
    pVrxDevCtx->nfcMaxDevFd = (maxDevFd) ? (maxDevFd + 1) : 0;
 
-   DTI_DevFdZero(&pVrxDevCtx->tmpDevFds);
+   DSL_CPE_FD_ZERO(&pVrxDevCtx->tmpDevFds);
 
 #endif
    return;
@@ -734,7 +726,7 @@ DTI_STATIC IFX_void_t DTI_devFdClear(
    At first the device msg will be read out to free the internal driver buffer.
    This is done independant on the established connection.
 */
-DTI_STATIC IFX_int_t DTI_autoMsgRecv(
+DSL_CPE_STATIC IFX_int_t DTI_autoMsgRecv(
                         DTI_DEV_VrxDriverCtx_t *pVrxDevCtx,
                         const DTI_Connection_t  *pDtiCon,
                         IFX_int_t               devIfNum,
@@ -748,12 +740,12 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
    IFX_uint16_t         *pModemPayload  = IFX_NULL;
    DTI_D2H_Message16_u  *pMsg16;
    IOCTL_MEI_message_t  msgRead;
-   DTI_PTR_U            uPayload;
+   DSL_PTR_U            uPayload;
 
    /*
       First: read out the msg to free the driver.
    */
-   DTI_MemSet(&msgRead, 0x00, sizeof(msgRead));
+   cpe_control_memset_s(&msgRead, sizeof(msgRead), 0x00, sizeof(msgRead));
 
    msgRead.pPayload      = (unsigned char*)pVrxDevCtx->pAutoMsgBuf;
    msgRead.paylSize_byte = (unsigned int)pVrxDevCtx->autoMsgBuf_byte;
@@ -763,12 +755,12 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
                FIO_MEI_MBOX_NFC_RD,
                (DSL_int_t)&msgRead) < 0 )
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Auto Msg[0x04X%] - ioctl error)."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Auto Msg[0x04X%] - ioctl error)."DSL_CPE_CRLF,
            msgRead.msgId));
 
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("\tNFC[0x04X%]."DTI_CRLF,msgRead.msgId));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("\tNFC[0x04X%]."DSL_CPE_CRLF,msgRead.msgId));
 
       packetError = DTI_eErrPortAutoOperation;
    }
@@ -778,30 +770,30 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
    */
    if (outBufferSize_byte < (sizeof(DTI_PacketHeader_t) + sizeof(IOCTL_MEI_message_t)))
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Auto Msg - not enough out buffer."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Auto Msg - not enough out buffer."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
 
    /* setup out packet */
    uPayload.pUInt8 = (IFX_uint8_t *)pOutBuffer;
-   pAutoMsgPacket  = (DTI_Packet_t *)DTI_PTR_CAST_GET_ULONG(uPayload);
+   pAutoMsgPacket  = (DTI_Packet_t *)DSL_PTR_CAST_GET_ULONG(uPayload);
    if (pAutoMsgPacket == IFX_NULL)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Auto Msg - DTI Packet out buffer missaligned."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Auto Msg - DTI Packet out buffer missaligned."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
 
    /* setup out packet - payload */
    uPayload.pUInt8 = (IFX_uint8_t *)pAutoMsgPacket->payload;
-   pMsg16     = (DTI_D2H_Message16_u *)DTI_PTR_CAST_GET_UINT16(uPayload);
+   pMsg16     = (DTI_D2H_Message16_u *)DSL_PTR_CAST_GET_UINT16(uPayload);
    if (pMsg16 == IFX_NULL)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Auto Msg - DTI Payload out buffer missaligned."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Auto Msg - DTI Payload out buffer missaligned."DSL_CPE_CRLF));
 
       packetError = (packetError == DTI_eNoError) ? DTI_eErrMalformedPacket : packetError;
    }
@@ -810,11 +802,11 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
    {
       /* modem msg payload = index[16Bit] + length[16Bit] + Payload Data[16/32 Bit] */
       uPayload.pUInt8 = (IFX_uint8_t *)msgRead.pPayload;
-      pModemPayload   = (IFX_uint16_t *)DTI_PTR_CAST_GET_UINT16(uPayload);
+      pModemPayload   = (IFX_uint16_t *)DSL_PTR_CAST_GET_UINT16(uPayload);
       if (pModemPayload == IFX_NULL)
       {
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-            ("ERROR: Vrx Dev Auto Msg - DTI Payload modem buffer missaligned."DTI_CRLF));
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+            ("ERROR: Vrx Dev Auto Msg - DTI Payload modem buffer missaligned."DSL_CPE_CRLF));
 
          packetError = (packetError == DTI_eNoError) ? DTI_eErrMalformedPacket : packetError;
       }
@@ -830,8 +822,8 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
       if ( paylBufferSize_byte < ((IFX_int_t)msgRead.paylSize_byte) )
       {
          /* not enough buffer - cut payload and setup error packet */
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-            ("ERROR: Vrx Dev Auto Msg - cut Payload."DTI_CRLF));
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+            ("ERROR: Vrx Dev Auto Msg - cut Payload."DSL_CPE_CRLF));
          packetError = DTI_eErrInvalidPayloadSize;
       }
       else
@@ -854,7 +846,9 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
          pMsg16->raw.data[VRX_DTI_MSG_IDX_MSDID] = msgRead.msgId;
          if (paylBufferSize_byte > 0)
          {
-            DTI_MemCpy(&pMsg16->raw.data[VRX_DTI_MSG_IDX_INDEX], msgRead.pPayload, paylBufferSize_byte);
+            cpe_control_memcpy_s(&pMsg16->raw.data[VRX_DTI_MSG_IDX_INDEX],
+                        sizeof(pMsg16->raw.data[VRX_DTI_MSG_IDX_INDEX]),
+                        msgRead.pPayload, paylBufferSize_byte);
          }
       }
    }
@@ -874,12 +868,12 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
 
    DTI_packetShow (
       pAutoMsgPacket, IFX_TRUE, IFX_FALSE, "Vrx AutoMsg",
-      (pAutoMsgPacket->header.error == DTI_eNoError) ? IFXOS_PRN_LEVEL_LOW : DTI_PRN_LEVEL_HIGH);
+      (pAutoMsgPacket->header.error == DTI_eNoError) ? IFXOS_PRN_LEVEL_LOW : DSL_PRN_LEVEL_HIGH);
 
    if (DTI_packetSend(pDtiCon, pAutoMsgPacket) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Auto Msg - send packet."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Auto Msg - send packet."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
@@ -902,7 +896,7 @@ DTI_STATIC IFX_int_t DTI_autoMsgRecv(
    -1 if something went wrong, else
    size of the mailbox
 */
-DTI_STATIC IFX_int_t DTI_configGet_MbSize(
+DSL_CPE_STATIC IFX_int_t DTI_configGet_MbSize(
                         DTI_DEV_VrxDriverCtx_t *pVrxDevCtx,
                         IFX_int_t               lineNum,
                         DTI_PacketError_t       *pPacketError)
@@ -911,29 +905,29 @@ DTI_STATIC IFX_int_t DTI_configGet_MbSize(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Config Get MB Size - device open error."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Config Get MB Size - device open error."DSL_CPE_CRLF));
 
       return -1;
    }
 
-   DTI_MemSet(&reqCfg, 0x00, sizeof(IOCTL_MEI_reqCfg_t));
+   cpe_control_memset_s(&reqCfg, sizeof(reqCfg), 0x00, sizeof(IOCTL_MEI_reqCfg_t));
 
    if ( (DSL_CPE_Ioctl(
             pVrxDevCtx->pDevFds[lineNum],
             FIO_MEI_REQ_CONFIG,
             (DSL_int_t)&reqCfg)) < 0 )
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Config Get MB Size - request config error."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Config Get MB Size - request config error."DSL_CPE_CRLF));
 
       *pPacketError = DTI_eErrPortOperation;
       return -1;
    }
    else
    {
-      DTI_PRN_USR_DBG_NL(DTI_VRX, DTI_PRN_LEVEL_NORMAL,
-         ("Vrx Config MB Size: ME2ARC = 0x%X, ARC2ME = 0x%X."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_NORMAL,
+         ("Vrx Config MB Size: ME2ARC = 0x%X, ARC2ME = 0x%X."DSL_CPE_CRLF,
            reqCfg.Me2ArcOnlineMbSize, reqCfg.Arc2MeOnlineMbSize));
 
       *pPacketError = DTI_eNoError;
@@ -959,14 +953,14 @@ DTI_STATIC IFX_int_t DTI_configGet_MbSize(
    -1 if something went wrong, else
    size of the mailbox
 */
-DTI_STATIC IFX_int_t
+DSL_CPE_STATIC IFX_int_t
 DTI_traceBufferDbgStrmCfg(DTI_DEV_VrxDriverCtx_t *pVrxDevCtx,
                           IFX_int_t lineNum,
                           IOCTL_MEI_DEBUG_STREAM_configGet_t *pCfgGet,
                           IOCTL_MEI_DEBUG_STREAM_configSet_t *pCfgSet)
 {
    /* get current config */
-   DTI_MemSet(pCfgGet, 0x00, sizeof(IOCTL_MEI_DEBUG_STREAM_configGet_t));
+   cpe_control_memset_s(pCfgGet, sizeof(pCfgGet), 0x00, sizeof(IOCTL_MEI_DEBUG_STREAM_configGet_t));
 
    if (IFXOS_DeviceControl(pVrxDevCtx->pDevFds[lineNum],
       FIO_MEI_DEBUG_STREAM_CONFIG_GET,
@@ -978,27 +972,27 @@ DTI_traceBufferDbgStrmCfg(DTI_DEV_VrxDriverCtx_t *pVrxDevCtx,
             FIO_MEI_DEBUG_STREAM_CONFIG_SET,
             (IFX_int_t)pCfgSet) < 0)
          {
-            DTI_PRN_USR_ERR_NL(
-            DTI_VRX, DTI_PRN_LEVEL_ERR,
+            DSL_CPE_PRN_USR_ERR_NL(
+            DSL_CPE, DSL_PRN_LEVEL_ERR,
             ("ERROR: Mei dbgStreamCfgGet - "\
-            "line %d, init set error."DTI_CRLF,
+            "line %d, init set error."DSL_CPE_CRLF,
             lineNum));
 
             return IFX_ERROR;
          }
          else
          {
-            DTI_MemSet(pCfgGet, 0x00, sizeof(IOCTL_MEI_DEBUG_STREAM_configGet_t));
+            cpe_control_memset_s(pCfgGet, sizeof(pCfgGet), 0x00, sizeof(IOCTL_MEI_DEBUG_STREAM_configGet_t));
             if (IFXOS_DeviceControl(
                pVrxDevCtx->pDevFds[lineNum],
                FIO_MEI_DEBUG_STREAM_CONFIG_GET,
                (IFX_int_t)pCfgGet) < 0)
             {
-               DTI_PRN_USR_ERR_NL(DTI_VRX,
-               DTI_PRN_LEVEL_ERR,
+               DSL_CPE_PRN_USR_ERR_NL(DSL_CPE,
+               DSL_PRN_LEVEL_ERR,
                ("ERROR: Mei dbgStreamCfgGet "\
                "- line %d, re-init get error"\
-               DTI_CRLF, lineNum));
+               DSL_CPE_CRLF, lineNum));
 
                return IFX_ERROR;
             }
@@ -1013,7 +1007,7 @@ DTI_traceBufferDbgStrmCfg(DTI_DEV_VrxDriverCtx_t *pVrxDevCtx,
    return IFX_SUCCESS;
 }
 
-DTI_STATIC IFX_int_t DTI_FwFeaturesGet(
+DSL_CPE_STATIC IFX_int_t DTI_FwFeaturesGet(
    IFX_char_t *pFirmware,
    const IFX_uint32_t nFwLength,
    DSL_FirmwareFeatures_t *pFwFeatures)
@@ -1092,13 +1086,13 @@ DTI_STATIC IFX_int_t DTI_FwFeaturesGet(
 
    if(i)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("Firmware WHAT String: %s"DTI_CRLF, pString));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("Firmware WHAT String: %s"DSL_CPE_CRLF, pString));
    }
    else
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("Firmware WHAT String not detected"DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("Firmware WHAT String not detected"DSL_CPE_CRLF));
    }
 
    pWhat = pString;
@@ -1162,10 +1156,10 @@ DTI_STATIC IFX_int_t DTI_FwFeaturesGet(
 /**
    Set a new debug level.
 */
-DTI_STATIC IFX_int_t DTI_VRX_PrintoutLevelSet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_PrintoutLevelSet(
                         IFX_int_t            newDbgLevel)
 {
-   IFXOS_PRN_USR_LEVEL_SET(DTI_VRX, newDbgLevel);
+   IFXOS_PRN_USR_LEVEL_SET(DSL_CPE, newDbgLevel);
 
    return IFX_SUCCESS;
 }
@@ -1183,20 +1177,20 @@ DTI_STATIC IFX_int_t DTI_VRX_PrintoutLevelSet(
    else IFX_ERROR.
 
 */
-DTI_STATIC IFX_int_t DTI_VRX_ModuleSetup(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_ModuleSetup(
                         DTI_DeviceSysInfo_t  *pDeviceSystemInfo,
                         DTI_DeviceCtx_t      **ppDtiDevCtx)
 {
    IFX_int_t   i, ctxSize = 0;
    DTI_DeviceCtx_t            *pDtiDevCtx = IFX_NULL;
    DTI_DEV_VrxDriverCtx_t  *pVrxDevCtx = IFX_NULL;
-   DTI_PTR_U                  uDtiDevCtx;
+   DSL_PTR_U                  uDtiDevCtx;
    IFX_int_t nDevNum;
 
    if ( (ppDtiDevCtx == IFX_NULL) || (pDeviceSystemInfo == IFX_NULL))
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Module Setup - NULL ptr args."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Module Setup - NULL ptr args."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
@@ -1211,8 +1205,8 @@ DTI_STATIC IFX_int_t DTI_VRX_ModuleSetup(
    {
       pDtiDevCtx = *ppDtiDevCtx;
 
-      DTI_PRN_USR_ERR_NL(DTI_VRX, IFXOS_PRN_LEVEL_WRN,
-         ("WARNING: Vrx Dev Module Setup - already done (devs = %d, ports = %d)."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, IFXOS_PRN_LEVEL_WRN,
+         ("WARNING: Vrx Dev Module Setup - already done (devs = %d, ports = %d)."DSL_CPE_CRLF,
          (pVrxDevCtx != IFX_NULL) ? pVrxDevCtx->numOfDevs : -1, 
          (pVrxDevCtx != IFX_NULL) ? pVrxDevCtx->numOfPorts : -1));
 
@@ -1250,60 +1244,60 @@ DTI_STATIC IFX_int_t DTI_VRX_ModuleSetup(
       pDeviceSystemInfo->bValid      = IFX_TRUE;
    } 
 
-   DTI_PRN_USR_DBG_NL(DTI_VRX, DTI_PRN_LEVEL_HIGH,
+   DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_HIGH,
       ("Vrx Dev Module Setup - update driver config (devs = %d, ports per dev = %d, total lines = %d, auto msg support = %d)."
-      DTI_CRLF, pDeviceSystemInfo->numOfDevs, pDeviceSystemInfo->portsPerDev, pDeviceSystemInfo->numOfPorts, 
+      DSL_CPE_CRLF, pDeviceSystemInfo->numOfDevs, pDeviceSystemInfo->portsPerDev, pDeviceSystemInfo->numOfPorts, 
                 pDeviceSystemInfo->bControlAutoDevMsgSupport));
 
    ctxSize = sizeof(DTI_DeviceCtx_t) + sizeof(DTI_DEV_VrxDriverCtx_t) +
              (sizeof(IFX_int_t) * pDeviceSystemInfo->numOfPorts);
    ctxSize += ((pDeviceSystemInfo->bControlAutoDevMsgSupport == IFX_TRUE) ? (DTI_DEV_VRX_DEFAULT_MBOX_SIZE) : 0);
 
-   uDtiDevCtx.pUInt8 = DTI_Malloc((IFX_uint_t)ctxSize);
+   uDtiDevCtx.pUInt8 = DSL_CPE_Malloc((IFX_uint_t)ctxSize);
    if (uDtiDevCtx.pUInt8 == IFX_NULL)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Module Setup - Dev Struct alloc."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Module Setup - Dev Struct alloc."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
    memset(uDtiDevCtx.pUInt8, 0x0, ctxSize);
    /* set context pointer */
-   pDtiDevCtx = (DTI_DeviceCtx_t *)DTI_PTR_CAST_GET_ULONG(uDtiDevCtx);
+   pDtiDevCtx = (DTI_DeviceCtx_t *)DSL_PTR_CAST_GET_ULONG(uDtiDevCtx);
    if (pDtiDevCtx == IFX_NULL)
    {
-      DTI_Free(uDtiDevCtx.pUInt8);
+      DSL_CPE_Free(uDtiDevCtx.pUInt8);
 
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Module Setup - Dev Struct miss-aligned."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Module Setup - Dev Struct miss-aligned."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
 
    /* set pDevice pointer*/
    uDtiDevCtx.pUInt8  += sizeof(DTI_DeviceCtx_t);
-   pVrxDevCtx = (DTI_DEV_VrxDriverCtx_t*)DTI_PTR_CAST_GET_UINT32(uDtiDevCtx);
+   pVrxDevCtx = (DTI_DEV_VrxDriverCtx_t*)DSL_PTR_CAST_GET_UINT32(uDtiDevCtx);
 
    if (pVrxDevCtx == IFX_NULL)
    {
-      DTI_Free(pDtiDevCtx);
+      DSL_CPE_Free(pDtiDevCtx);
 
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Module Setup - pDevice miss-aligned."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Module Setup - pDevice miss-aligned."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
 
    /* set devFd pointer */
    uDtiDevCtx.pUInt8  += sizeof(DTI_DEV_VrxDriverCtx_t);
-   pVrxDevCtx->pDevFds = (IFX_int_t *)DTI_PTR_CAST_GET_UINT32(uDtiDevCtx);
+   pVrxDevCtx->pDevFds = (IFX_int_t *)DSL_PTR_CAST_GET_UINT32(uDtiDevCtx);
 
    if (pVrxDevCtx->pDevFds == IFX_NULL)
    {
-      DTI_Free(pDtiDevCtx);
+      DSL_CPE_Free(pDtiDevCtx);
 
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Module Setup - Vnx devFds miss-aligned."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Module Setup - Vnx devFds miss-aligned."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
@@ -1312,14 +1306,14 @@ DTI_STATIC IFX_int_t DTI_VRX_ModuleSetup(
    if (pDeviceSystemInfo->bControlAutoDevMsgSupport == IFX_TRUE)
    {
       uDtiDevCtx.pUInt8  += (sizeof(IFX_int_t) * pDeviceSystemInfo->numOfPorts);
-      pVrxDevCtx->pAutoMsgBuf = (IFX_ulong_t *)DTI_PTR_CAST_GET_ULONG(uDtiDevCtx);
+      pVrxDevCtx->pAutoMsgBuf = (IFX_ulong_t *)DSL_PTR_CAST_GET_ULONG(uDtiDevCtx);
 
       if (pVrxDevCtx->pAutoMsgBuf == IFX_NULL)
       {
-         DTI_Free(pDtiDevCtx);
+         DSL_CPE_Free(pDtiDevCtx);
 
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-            ("ERROR: Vrx Dev Module Setup - Vnx Auto MSg Buffer miss-aligned."DTI_CRLF));
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+            ("ERROR: Vrx Dev Module Setup - Vnx Auto MSg Buffer miss-aligned."DSL_CPE_CRLF));
 
          return IFX_ERROR;
       }
@@ -1369,7 +1363,7 @@ DTI_STATIC IFX_int_t DTI_VRX_ModuleSetup(
    else IFX_ERROR.
 
 */
-DTI_STATIC IFX_int_t DTI_VRX_ModuleDelete(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_ModuleDelete(
                         DTI_DeviceSysInfo_t  *pDeviceSystemInfo,
                         DTI_DeviceCtx_t      **ppDtiDevCtx)
 {
@@ -1379,16 +1373,16 @@ DTI_STATIC IFX_int_t DTI_VRX_ModuleDelete(
 
    if (ppDtiDevCtx == IFX_NULL)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Module Delete - NULL ptr args."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Module Delete - NULL ptr args."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
 
    if (*ppDtiDevCtx == IFX_NULL)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Dev Module Delete - NULL ptr modul ctx."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Dev Module Delete - NULL ptr modul ctx."DSL_CPE_CRLF));
 
       return IFX_ERROR;
    }
@@ -1406,7 +1400,7 @@ DTI_STATIC IFX_int_t DTI_VRX_ModuleDelete(
       }
    }
 
-   DTI_Free(pDtiDevCtx);
+   DSL_CPE_Free(pDtiDevCtx);
 
    return IFX_SUCCESS;
 }
@@ -1424,7 +1418,7 @@ DTI_STATIC IFX_int_t DTI_VRX_ModuleDelete(
 \return
    Number of written bytes.
 */
-DTI_STATIC IFX_int_t DTI_VRX_SystemInfoWrite(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_SystemInfoWrite(
                         DTI_DeviceSysInfo_t  *pDeviceSystemInfo,
                         IFX_char_t           *pSysInfoBuffer,
                         IFX_int_t            bufferSize)
@@ -1432,37 +1426,37 @@ DTI_STATIC IFX_int_t DTI_VRX_SystemInfoWrite(
    IFX_int_t writtenLen = 0;
    const IFX_char_t *pBoardName = DTI_DEV_VRX_BOARD_NAME;
 
-   (void)DTI_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
+   (void)DSL_CPE_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
       "VendorName=%s", DTI_VENDOR_NAME_STR);
-   writtenLen = (IFX_int_t)DTI_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
+   writtenLen = (IFX_int_t)DSL_CPE_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
 
-   (void)DTI_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
+   (void)DSL_CPE_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
       "BoardName=%s", pBoardName);
-   writtenLen += (IFX_int_t)DTI_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
+   writtenLen += (IFX_int_t)DSL_CPE_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
 
-   (void)DTI_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
+   (void)DSL_CPE_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
       "BoardRevision=0.0");
-   writtenLen += (IFX_int_t)DTI_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
+   writtenLen += (IFX_int_t)DSL_CPE_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
 
    if (pDeviceSystemInfo->bValid == IFX_TRUE)
    {
-      (void)DTI_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
+      (void)DSL_CPE_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
          "NumOfDevices=%d", pDeviceSystemInfo->numOfDevs);
-      writtenLen += (IFX_int_t)DTI_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
+      writtenLen += (IFX_int_t)DSL_CPE_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
 
-      (void)DTI_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
+      (void)DSL_CPE_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
          "MaxChannel=%d", pDeviceSystemInfo->numOfPorts);
-      writtenLen += (IFX_int_t)DTI_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
+      writtenLen += (IFX_int_t)DSL_CPE_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
    }
    else
    {
-      (void)DTI_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
+      (void)DSL_CPE_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
          "NumOfDevices=<na>");
-      writtenLen += (IFX_int_t)DTI_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
+      writtenLen += (IFX_int_t)DSL_CPE_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
 
-      (void)DTI_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
+      (void)DSL_CPE_snprintf(&pSysInfoBuffer[writtenLen], bufferSize - writtenLen,
          "MaxChannel=<na>");
-      writtenLen += (IFX_int_t)DTI_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
+      writtenLen += (IFX_int_t)DSL_CPE_StrLen(&pSysInfoBuffer[writtenLen]) + 1;
    }
 
    return writtenLen;
@@ -1486,15 +1480,15 @@ DTI_STATIC IFX_int_t DTI_VRX_SystemInfoWrite(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_Reset(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Reset(
                         DTI_DeviceCtx_t         *pDtiDevCtx,
                         DTI_H2D_DeviceReset_t   *pInDevReset,
                         DTI_D2H_DeviceReset_t   *pOutDevReset,
                         IFX_int_t               rstMaskSize_32,
                         DTI_PacketError_t       *pPacketError)
 {
-   DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-      ("ERROR: Vrx Device Reset - not supported."DTI_CRLF));
+   DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+      ("ERROR: Vrx Device Reset - not supported."DSL_CPE_CRLF));
 
    *pPacketError = DTI_eErrUnknown;
    return IFX_SUCCESS;
@@ -1518,7 +1512,7 @@ DTI_STATIC IFX_int_t DTI_VRX_Reset(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_Download(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Download(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_ProtocolServerCtx_t    *pDtiProtServerCtx,
                         DTI_H2D_DeviceDownload_t   *pInDevDownload,
@@ -1557,9 +1551,9 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
    if ((nDevMin > pVrxDevCtx->numOfDevs) ||
        (nDevMax > pVrxDevCtx->numOfDevs) || (nDevCount == 0))
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
          ("ERROR: MEI Device Download - mask 0x%08X, max devs %d (nDevMin=%d, "
-         "nDevMax=%d, nDevCount=%d), truncate."DTI_CRLF, 
+         "nDevMax=%d, nDevCount=%d), truncate."DSL_CPE_CRLF, 
          pInDevDownload->loadMask, pVrxDevCtx->numOfDevs, nDevMin,
          nDevMax, nDevCount));
    }
@@ -1572,8 +1566,8 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
                               (IFX_int_t)pInDevDownload->imageNum,
                               1, &imgCtrl, pPacketError) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: MEI Device Download - image %d get."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: MEI Device Download - image %d get."DSL_CPE_CRLF,
          pInDevDownload->imageNum));
 
       *pPacketError = DTI_eErrPortOperation;
@@ -1584,8 +1578,8 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
    {
       if ((imgCtrl->pData == IFX_NULL) || (imgCtrl->imageSize == 0))
       {
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-            ("ERROR: MEI Device Download - image %d empty."DTI_CRLF,
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+            ("ERROR: MEI Device Download - image %d empty."DSL_CPE_CRLF,
                pInDevDownload->imageNum));
 
          *pPacketError = DTI_eErrPortOperation;
@@ -1594,8 +1588,8 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
    }
    else
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: MEI Device Download - failed to get image."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: MEI Device Download - failed to get image."DSL_CPE_CRLF));
       goto DTI_AGENT_DOWNLOAD_EXIT;
    }
    nDevCount=0;
@@ -1603,16 +1597,16 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
    {
       if (nDevCount >= pVrxDevCtx->numOfDevs)
       {
-         DTI_PRN_USR_DBG_NL(DTI_VRX, DTI_PRN_LEVEL_LOW,
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_LOW,
             ("MEI Device Download - break, nDevCount(%d) >= numOfDevs(%d). "
-            DTI_CRLF, nDevCount, pVrxDevCtx->numOfDevs));
+            DSL_CPE_CRLF, nDevCount, pVrxDevCtx->numOfDevs));
          break;
       }
 
       if (!(pInDevDownload->loadMask & (0x1 << nDevNum)))
       {
-         DTI_PRN_USR_DBG_NL(DTI_VRX, DTI_PRN_LEVEL_LOW,
-            ("MEI Device Download - skip FW download on device %d."DTI_CRLF,
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_LOW,
+            ("MEI Device Download - skip FW download on device %d."DSL_CPE_CRLF,
             nDevNum));
          continue;
       }
@@ -1624,8 +1618,8 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
       fd = DTI_DevOpenByName(nDevNum, DSL_CPE_IFX_LOW_DEV);
       if (fd < 0)
       {
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-            ("ERROR: Mei Device Download - open control device %d."DTI_CRLF,
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+            ("ERROR: Mei Device Download - open control device %d."DSL_CPE_CRLF,
                nDevNum));
 
             *pPacketError = DTI_eErrPortOperation;
@@ -1635,16 +1629,16 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
       /*
          reset MEI driver
       */
-      DTI_MemSet(&MEI_ResetArgs, 0x00, sizeof(IOCTL_MEI_reset_t));
+      cpe_control_memset_s(&MEI_ResetArgs, sizeof(MEI_ResetArgs), 0x00, sizeof(IOCTL_MEI_reset_t));
 
       MEI_ResetArgs.rstMode = (IOCTL_MEI_resetMode_e)0;
       MEI_ResetArgs.rstSelMask = (unsigned int)0x1F;
 
       if (IFXOS_DeviceControl(fd, FIO_MEI_RESET, (IFX_int_t)&MEI_ResetArgs) < 0)
       {
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
             ("ERROR: MEI Device Download - ioctl MEI_RESET "
-            "retCode = %d."DTI_CRLF, MEI_ResetArgs.ictl.retCode));
+            "retCode = %d."DSL_CPE_CRLF, MEI_ResetArgs.ictl.retCode));
 
          *pPacketError = DTI_eErrPortOperation;
          goto DTI_AGENT_DOWNLOAD_EXIT;
@@ -1653,7 +1647,7 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
       /*
          configure FW mode
       */
-      DTI_MemSet(&MEI_FwMode, 0x00, sizeof(IOCTL_MEI_FwModeCtrlSet_t));
+      cpe_control_memset_s(&MEI_FwMode, sizeof(MEI_FwMode), 0x00, sizeof(IOCTL_MEI_FwModeCtrlSet_t));
 
       DTI_FwFeaturesGet((DSL_char_t*)imgCtrl->pData,
                         (IFX_uint32_t)imgCtrl->imageSize,
@@ -1669,9 +1663,9 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
       if (IFXOS_DeviceControl(fd, FIO_MEI_FW_MODE_CTRL_SET,
           (IFX_int_t)&MEI_FwMode) < 0)
       {
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
             ("ERROR: MEI Device Download - ioctl FIO_MEI_FW_MODE_CTRL_SET "
-            " %d, retCode = %d."DTI_CRLF, MEI_FwMode.ictl.retCode));
+            " %d, retCode = %d."DSL_CPE_CRLF, MEI_FwMode.ictl.retCode));
 
          *pPacketError = DTI_eErrPortOperation;
          goto DTI_AGENT_DOWNLOAD_EXIT;
@@ -1680,27 +1674,27 @@ DTI_STATIC IFX_int_t DTI_VRX_Download(
       /*
          do FW download
       */
-      DTI_PRN_USR_DBG_NL(DTI_VRX, DTI_PRN_LEVEL_LOW,
-         ("MEI Device Download - start FW download on device %d."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_LOW,
+         ("MEI Device Download - start FW download on device %d."DSL_CPE_CRLF,
          nDevNum));
 
-      DTI_MemSet(&MEI_FwDl, 0x00, sizeof(MEI_FwDl));
+      cpe_control_memset_s(&MEI_FwDl, sizeof(MEI_FwDl), 0x00, sizeof(MEI_FwDl));
       MEI_FwDl.pFwImage = (unsigned char *)imgCtrl->pData;
       MEI_FwDl.size_byte = (IFX_uint32_t)imgCtrl->imageSize;
 
       if (IFXOS_DeviceControl(fd, FIO_MEI_FW_DL, (IFX_int_t)&MEI_FwDl) < 0)
       {
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-            ("ERROR: MEI Device Download - ioctl FW download."DTI_CRLF));
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+            ("ERROR: MEI Device Download - ioctl FW download."DSL_CPE_CRLF));
 
          *pPacketError = DTI_eErrPortOperation;
          goto DTI_AGENT_DOWNLOAD_EXIT;
       }
       else
       {
-         DTI_PRN_USR_DBG_NL(DTI_VRX, DTI_PRN_LEVEL_LOW,
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_LOW,
             ("MEI Device Download - FW download on device %d successful ."
-            DTI_CRLF, nDevNum));
+            DSL_CPE_CRLF, nDevNum));
       }
 
       if (fd != -1)
@@ -1738,8 +1732,8 @@ DTI_AGENT_DOWNLOAD_EXIT:
 
    return (*pPacketError == DTI_eNoError) ? IFX_SUCCESS : IFX_ERROR;
 #else
-   DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-      ("ERROR: Vrx Device Download - not supported."DTI_CRLF));
+   DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+      ("ERROR: Vrx Device Download - not supported."DSL_CPE_CRLF));
 
    *pPacketError = DTI_eErrUnknown;
    return IFX_SUCCESS;
@@ -1761,7 +1755,7 @@ DTI_AGENT_DOWNLOAD_EXIT:
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_DeviceOpen(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_DeviceOpen(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         IFX_int_t            lineNum,
                         DTI_PacketError_t    *pPacketError)
@@ -1772,8 +1766,8 @@ DTI_STATIC IFX_int_t DTI_VRX_DeviceOpen(
 
    if (lineNum > DTI_DEV_MAX_LINE_NUMBER)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Device Open - line number %d is different from 0."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Device Open - line number %d is different from 0."DSL_CPE_CRLF,
           lineNum));
           
       *pPacketError = DTI_eErrPortOutOfRange;          
@@ -1799,7 +1793,7 @@ DTI_STATIC IFX_int_t DTI_VRX_DeviceOpen(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_DeviceClose(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_DeviceClose(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         IFX_int_t            lineNum,
                         DTI_PacketError_t    *pPacketError)
@@ -1810,8 +1804,8 @@ DTI_STATIC IFX_int_t DTI_VRX_DeviceClose(
 
    if (lineNum > DTI_DEV_MAX_LINE_NUMBER)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx Device Close - line number %d is different from 0."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx Device Close - line number %d is different from 0."DSL_CPE_CRLF,
           lineNum));
           
       *pPacketError = DTI_eErrPortOutOfRange;
@@ -1840,15 +1834,15 @@ DTI_STATIC IFX_int_t DTI_VRX_DeviceClose(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_RegisterLock(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_RegisterLock(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_DeviceLock_t *pInLock,
                         DTI_D2H_DeviceLock_t *pOutLock,
                         IFX_int_t            lineNum,
                         DTI_PacketError_t    *pPacketError)
 {
-   DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-      ("ERROR: Vrx Lock - not supported."DTI_CRLF));
+   DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+      ("ERROR: Vrx Lock - not supported."DSL_CPE_CRLF));
 
    pOutLock->lock = 0;
    *pPacketError  = DTI_eErrUnknown;
@@ -1876,7 +1870,7 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterLock(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_RegisterGet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_RegisterGet(
                         DTI_DeviceCtx_t         *pDtiDevCtx,
                         DTI_H2D_RegisterGet_t   *pInRegGet,
                         DTI_D2H_RegisterGet_t   *pOutRegGet,
@@ -1894,8 +1888,8 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterGet(
 
    if (regCount > pVrxDevCtx->numOfRegAccess)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx RegisterGet - line %d, count %d > max %d."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx RegisterGet - line %d, count %d > max %d."DSL_CPE_CRLF,
           lineNum, regCount, pVrxDevCtx->numOfRegAccess));
 
       *pPacketError      = DTI_eErrConfiguration;
@@ -1905,22 +1899,22 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterGet(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx RegisterGet - device open error." DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx RegisterGet - device open error." DSL_CPE_CRLF));
 
       return IFX_SUCCESS;
    }
 
    for (count = 0; count < regCount; count++)
    {
-      DTI_MemSet(&regIO, 0x00, sizeof(regIO));
+      cpe_control_memset_s(&regIO, sizeof(regIO), 0x00, sizeof(regIO));
       regIO.addr = (unsigned int)pInRegGet->address;
 
       if ( (DSL_CPE_Ioctl(
                   pVrxDevCtx->pDevFds[lineNum], FIO_MEI_REG_GET, (DSL_int_t)&regIO)) < 0 )
       {
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-            ("ERROR: Vrx RegisterGet - ioctl error."DTI_CRLF));
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+            ("ERROR: Vrx RegisterGet - ioctl error."DSL_CPE_CRLF));
 
          break;
       }
@@ -1963,7 +1957,7 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterGet(
    IFX_SUCCESS DTI Packet Error code is "no error".
    IFX_ERROR   if the register read operation fails.
 */
-DTI_STATIC IFX_int_t DTI_VRX_RegisterSet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_RegisterSet(
                         DTI_DeviceCtx_t         *pDtiDevCtx,
                         DTI_H2D_RegisterSet_t   *pInRegSet,
                         IFX_int_t               inRegSetSize_Byte,
@@ -1978,8 +1972,8 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterSet(
 
    if ( (regCount > pVrxDevCtx->numOfRegAccess) || (regCount <= 0) )
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx RegisterSet - line %d, count %d (max %d)."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx RegisterSet - line %d, count %d (max %d)."DSL_CPE_CRLF,
           lineNum, regCount, pVrxDevCtx->numOfRegAccess));
 
       *pPacketError = DTI_eErrInvalidPayloadSize;
@@ -1989,8 +1983,8 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterSet(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx RegisterSet - device open error." DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx RegisterSet - device open error." DSL_CPE_CRLF));
 
       return IFX_SUCCESS;
    }
@@ -1999,15 +1993,15 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterSet(
 
    for (count = 0; count < regCount; count++)
    {
-      DTI_MemSet(&regIO, 0x00, sizeof(regIO));
+      cpe_control_memset_s(&regIO, sizeof(regIO), 0x00, sizeof(regIO));
       regIO.addr = (unsigned int)pInRegSet->address;
       regIO.value  = (unsigned int)pInRegSet->data[count];
 
       if ( (DSL_CPE_Ioctl(
                   pVrxDevCtx->pDevFds[lineNum], FIO_MEI_REG_SET, (DSL_int_t)&regIO)) < 0 )
       {
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-            ("ERROR: Vrx RegisterSet - ioctl error."DTI_CRLF));
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+            ("ERROR: Vrx RegisterSet - ioctl error."DSL_CPE_CRLF));
 
          *pPacketError = DTI_eErrPortOperation;
 
@@ -2043,7 +2037,7 @@ DTI_STATIC IFX_int_t DTI_VRX_RegisterSet(
    Changes of the autonomous message handling may have influence to the
    connection settings (select wait time)
 */
-DTI_STATIC IFX_int_t DTI_VRX_ConfigSet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_ConfigSet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_H2D_DeviceConfigSet_t  *pInCfgSet,
                         DTI_D2H_DeviceConfigSet_t  *pOutCfgSet,
@@ -2136,7 +2130,7 @@ DTI_STATIC IFX_int_t DTI_VRX_ConfigSet(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_ConfigGet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_ConfigGet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_H2D_DeviceConfigGet_t  *pInCfgGet,
                         DTI_D2H_DeviceConfigGet_t  *pOutCfgGet,
@@ -2205,7 +2199,7 @@ DTI_STATIC IFX_int_t DTI_VRX_ConfigGet(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_Message16Send(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Message16Send(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_Message16_u  *pInMsg16Send,
                         DTI_D2H_Message16_u  *pOutMsg16Send,
@@ -2220,8 +2214,8 @@ DTI_STATIC IFX_int_t DTI_VRX_Message16Send(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx msg16 Send - device open error" DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx msg16 Send - device open error" DSL_CPE_CRLF));
          
       *pOutPaylSize_byte = 0;
 
@@ -2288,7 +2282,7 @@ DTI_STATIC IFX_int_t DTI_VRX_Message16Send(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_Message32Send(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Message32Send(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_Message32_u  *pInMsg32Send,
                         DTI_D2H_Message32_u  *pOutMsg32Send,
@@ -2303,8 +2297,8 @@ DTI_STATIC IFX_int_t DTI_VRX_Message32Send(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx msg32 Send - line %d %s."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx msg32 Send - line %d %s."DSL_CPE_CRLF,
           lineNum, (*pPacketError == DTI_eErrPortOutOfRange) ? "range error" : "open error"));
 
       *pOutPaylSize_byte = 0;
@@ -2369,7 +2363,7 @@ DTI_STATIC IFX_int_t DTI_VRX_Message32Send(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_Message8Send(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_Message8Send(
                         DTI_DeviceCtx_t * pDtiDevCtx,
                         DTI_H2D_Message8_u *pInMsg8Send,
                         DTI_D2H_Message8_u *pOutMsg8Send, 
@@ -2378,8 +2372,8 @@ DTI_STATIC IFX_int_t DTI_VRX_Message8Send(
                         IFX_int_t * pOutPaylSize_byte,
                         DTI_PacketError_t *pPacketError)
 {
-   DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-      ("ERROR: Vrx Msg8 Send - not necessary (supported)."DTI_CRLF));
+   DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+      ("ERROR: Vrx Msg8 Send - not necessary (supported)."DSL_CPE_CRLF));
 
    *pPacketError  = DTI_eErrUnknown;
 
@@ -2409,7 +2403,7 @@ DTI_STATIC IFX_int_t DTI_VRX_Message8Send(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   debug stream setup failed.
 */
-DTI_STATIC IFX_int_t DTI_VRX_TraceBufferConfigSet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_TraceBufferConfigSet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_H2D_TraceConfigSet_t   *pInTraceConfigSet,
                         DTI_D2H_TraceConfigSet_t   *pOutTraceConfigSet,
@@ -2428,8 +2422,8 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferConfigSet(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS) 
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Mei TraceBufferConfigSet - line %d %s"DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Mei TraceBufferConfigSet - line %d %s"DSL_CPE_CRLF,
          lineNum, (*pPacketError == DTI_eErrPortOutOfRange) ?
          "range error" : "open error"));
       pOutTraceConfigSet->size = 0;
@@ -2493,7 +2487,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferConfigSet(
       }
    }
 
-   DTI_MemSet(&ioCmd.cfg, 0, sizeof(IOCTL_MEI_DEBUG_STREAM_configSet_t));
+   cpe_control_memset_s(&ioCmd.cfg, sizeof(ioCmd.cfg), 0, sizeof(IOCTL_MEI_DEBUG_STREAM_configSet_t));
    ioCmd.cfg.operationMode = (MEI_DBG_STREAM_BUF_OPMODE_E)nOpMode;
    ioCmd.cfg.bufferSize = (unsigned int) pInTraceConfigSet->size;
 
@@ -2506,7 +2500,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferConfigSet(
       *pPacketError = DTI_eErrPortOperation;
    }
 
-   DTI_MemSet(&ioCmd.ctrl, 0, sizeof(IOCTL_MEI_DEBUG_STREAM_control_t));
+   cpe_control_memset_s(&ioCmd.ctrl, sizeof(ioCmd.ctrl), 0, sizeof(IOCTL_MEI_DEBUG_STREAM_control_t));
    ioCmd.ctrl.operationMode = (MEI_DBG_STREAM_BUF_OPMODE_E)nOpMode;
    ioCmd.ctrl.onOff = 1;
 
@@ -2547,7 +2541,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferConfigSet(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   debug stream setup failed.
 */
-DTI_STATIC IFX_int_t DTI_VRX_TraceBufferReset(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_TraceBufferReset(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         IFX_int_t            lineNum,
                         DTI_PacketError_t    *pPacketError)
@@ -2557,8 +2551,8 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferReset(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Mei trace buffer reset - line %d %s."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Mei trace buffer reset - line %d %s."DSL_CPE_CRLF,
          lineNum, (*pPacketError == DTI_eErrPortOutOfRange) ?
          "range error" : "open error"));
 
@@ -2595,7 +2589,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferReset(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   debug stream config request failed.
 */
-DTI_STATIC IFX_int_t DTI_VRX_TraceBufferStatusGet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_TraceBufferStatusGet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_D2H_TraceStatusGet_t   *pOutTraceStatusGet,
                         IFX_int_t                  lineNum,
@@ -2610,8 +2604,8 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferStatusGet(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Mei TraceBufferStatusGet - line %d %s."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Mei TraceBufferStatusGet - line %d %s."DSL_CPE_CRLF,
          lineNum,
          (*pPacketError == DTI_eErrPortOutOfRange) ?
          "range error" : "open error"));
@@ -2656,7 +2650,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferStatusGet(
 
       pOutTraceStatusGet->size = (IFX_uint32_t)ioCmd.pCfgGet.bufferSize;
 
-      DTI_MemSet(&ioCmd.statistics, 0x00,
+      cpe_control_memset_s(&ioCmd.statistics, sizeof(ioCmd.statistics), 0x00,
          sizeof(IOCTL_MEI_DEBUG_STREAM_statistic_t));
 
       if (IFXOS_DeviceControl(pVrxDevCtx->pDevFds[lineNum],
@@ -2715,7 +2709,7 @@ DTI_DEV_TRACE_BUFFER_STATUS_GET_ERR:
       - size of the used out package.
    IFX_ERROR   data read failed.
 */
-DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
                         DTI_DeviceCtx_t            *pDtiDevCtx,
                         DTI_H2D_TraceBufferGet_t   *pInTraceBufferGet,
                         DTI_Packet_t               **ppUsedDtiPacketOut,
@@ -2725,7 +2719,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
                         DTI_PacketError_t          *pPacketError)
 {
    IFX_int_t nRet = (IFX_int_t)IFX_SUCCESS, nBufferOutSize;
-   DTI_PTR_U uPtr;
+   DSL_PTR_U uPtr;
    IOCTL_MEI_DEBUG_STREAM_data_t stream;
    DTI_DEV_VrxDriverCtx_t *pVrxDevCtx = pDtiDevCtx->pDevice;
    DTI_Packet_t *pDtiPacketOut;
@@ -2742,7 +2736,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
             (IFX_uint32_t) (pVrxDevCtx->dbgStreamUserBuf_byte -
             sizeof(DTI_PacketHeader_t)) )
          {
-            DTI_Free(pVrxDevCtx->pDbgStreamUserBuf);
+            DSL_CPE_Free(pVrxDevCtx->pDbgStreamUserBuf);
             pVrxDevCtx->pDbgStreamUserBuf = IFX_NULL;
             pVrxDevCtx->dbgStreamUserBuf_byte = 0;
          }
@@ -2759,7 +2753,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
          }
 
          pVrxDevCtx->dbgStreamUserBuf_byte = nBufferOutSize;
-         pVrxDevCtx->pDbgStreamUserBuf = DTI_Malloc((IFX_size_t)nBufferOutSize);
+         pVrxDevCtx->pDbgStreamUserBuf = DSL_CPE_Malloc((IFX_size_t)nBufferOutSize);
 
          if (pVrxDevCtx->pDbgStreamUserBuf == IFX_NULL)
          {
@@ -2773,13 +2767,13 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
       }
 
       uPtr.pUInt8 = pVrxDevCtx->pDbgStreamUserBuf;
-      pDtiPacketOut = (DTI_Packet_t *)DTI_PTR_CAST_GET_ULONG(uPtr);
+      pDtiPacketOut = (DTI_Packet_t *)DSL_PTR_CAST_GET_ULONG(uPtr);
 
       if (pDtiPacketOut == IFX_NULL)
       {
          if (pVrxDevCtx->pDbgStreamUserBuf != IFX_NULL)
          {
-            DTI_Free(pVrxDevCtx->pDbgStreamUserBuf);
+            DSL_CPE_Free(pVrxDevCtx->pDbgStreamUserBuf);
             pVrxDevCtx->pDbgStreamUserBuf = IFX_NULL;
             pVrxDevCtx->dbgStreamUserBuf_byte = 0;
          }
@@ -2787,9 +2781,9 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
          *pPacketError = DTI_eErrMalformedPacket;
          *pTrBufReadSize_byte = 0;
 
-         DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
+         DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
             ("Error: Mei Packet Trace Buffer Get - "\
-            "missaligned user stream buffer."DTI_CRLF));
+            "missaligned user stream buffer."DSL_CPE_CRLF));
 
          return IFX_SUCCESS;
       }
@@ -2804,13 +2798,13 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
 
    /* asign packet payload */
    uPtr.pUInt8 = pDtiPacketOut->payload;
-   pOutTraceBufferGet =(DTI_D2H_TraceBufferGet_t *)DTI_PTR_CAST_GET_ULONG(uPtr);
+   pOutTraceBufferGet =(DTI_D2H_TraceBufferGet_t *)DSL_PTR_CAST_GET_ULONG(uPtr);
 
    if (pOutTraceBufferGet == IFX_NULL)
    {
       if (pVrxDevCtx->pDbgStreamUserBuf != IFX_NULL)
       {
-         DTI_Free(pVrxDevCtx->pDbgStreamUserBuf);
+         DSL_CPE_Free(pVrxDevCtx->pDbgStreamUserBuf);
          pVrxDevCtx->pDbgStreamUserBuf = IFX_NULL;
          pVrxDevCtx->dbgStreamUserBuf_byte = 0;
       }
@@ -2818,9 +2812,9 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
       *pPacketError = DTI_eErrMalformedPacket;
       *pTrBufReadSize_byte = 0;
 
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
          ("Error: Mei Packet Trace Buffer Get - "\
-         "missaligned payload."DTI_CRLF));
+         "missaligned payload."DSL_CPE_CRLF));
 
       return IFX_SUCCESS;
    }
@@ -2829,9 +2823,9 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
    {
       *pTrBufReadSize_byte = 0;
 
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
          ("ERROR: Mei Packet Trace Buffer Get - "\
-         "line %d %s." DTI_CRLF,
+         "line %d %s." DSL_CPE_CRLF,
          lineNum,
          (*pPacketError == DTI_eErrPortOutOfRange) ?
          "range error" : "open error"));
@@ -2840,14 +2834,14 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
    }
 
    /* read until buffer full or no more data available */
-   DTI_MemSet(&stream, 0x00, sizeof(IOCTL_MEI_DEBUG_STREAM_data_t));
-   stream.dataBufferSize_byte = (unsigned int)pInTraceBufferGet->size;
+   cpe_control_memset_s(&stream, sizeof(stream), 0x00, sizeof(IOCTL_MEI_DEBUG_STREAM_data_t));
+   stream.dataBufferSize_byte = (unsigned int)nBufferOutSize;
    stream.pData = (unsigned char *)pOutTraceBufferGet->data;
 
-   DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_LOW,
-      ("ERROR: Mei Packet Trace Buffer Get - line %d, "\
+   DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_LOW,
+      ("Mei Packet Trace Buffer Get - line %d, "\
       "InTraceBufferGet->size=%d, nBufferOutSize=%d."\
-      DTI_CRLF,
+      DSL_CPE_CRLF,
       lineNum, pInTraceBufferGet->size, nBufferOutSize));
 
    if ((stream.dataBufferSize_byte == 0) || (stream.pData == IFX_NULL))
@@ -2870,20 +2864,14 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
       (IFX_int_t)stream.dataBufferSize_byte) ||
       (pInTraceBufferGet->size < (IFX_uint32_t)stream.dataBufferSize_byte) )
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
          ("ERROR: Mei Packet Trace Buffer Get - "\
          "line %d, ioctl error recv = %d > "\
-         "ioctlreq = %d / dtireq = %d."DTI_CRLF,
+         "ioctlreq = %d / dtireq = %d."DSL_CPE_CRLF,
          lineNum, stream.dataBufferSize_byte,
          (nBufferOutSize -
          sizeof(DTI_PacketHeader_t)),
          pInTraceBufferGet->size ));
-
-      *pTrBufReadSize_byte = (IFX_int_t)pInTraceBufferGet->size;
-   }
-   else
-   {
-      *pTrBufReadSize_byte = (IFX_int_t)stream.dataBufferSize_byte;
    }
 
    *pPacketError = DTI_eNoError;
@@ -2914,7 +2902,7 @@ DTI_STATIC IFX_int_t DTI_VRX_TraceBufferGet(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_DebugRead(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_DebugRead(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_DebugRead_t  *pInDbgGet,
                         DTI_D2H_DebugRead_t  *pOutDbgGet,
@@ -2930,8 +2918,8 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugRead(
 
    if (pInDbgGet->count > (IFX_uint32_t)pVrxDevCtx->numOfRegAccess)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx DebugRead - line %d, count %d > max %d."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx DebugRead - line %d, count %d > max %d."DSL_CPE_CRLF,
           lineNum, pInDbgGet->count, pVrxDevCtx->numOfDebugAccess));
 
       *pPacketError  = DTI_eErrConfiguration;
@@ -2941,13 +2929,13 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugRead(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx DebugRead - device open error." DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx DebugRead - device open error." DSL_CPE_CRLF));
 
       return IFX_SUCCESS;
    }
 
-   DTI_MemSet(&dbgAcc, 0x00, sizeof(IOCTL_MEI_dbgAccess_t));
+   cpe_control_memset_s(&dbgAcc, sizeof(dbgAcc), 0x00, sizeof(IOCTL_MEI_dbgAccess_t));
    dbgAcc.count    = (unsigned int)((pInDbgGet->count) ? pInDbgGet->count : 1);
    dbgAcc.dbgAddr  = (unsigned int)pInDbgGet->offset;
    dbgAcc.dbgDest  = (unsigned int) pInDbgGet->type;
@@ -2958,8 +2946,8 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugRead(
                FIO_MEI_DBG_READ,
                (DSL_int_t)&dbgAcc)) < 0 )
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx DebugRead - ioctl error)."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx DebugRead - ioctl error)."DSL_CPE_CRLF));
 
       *pPacketError = DTI_eErrPortOperation;
    }
@@ -2992,7 +2980,7 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugRead(
    IFX_SUCCESS and returns the DTI Packet Error code.
    IFX_ERROR   currently no (only in case of non-DTI related errors).
 */
-DTI_STATIC IFX_int_t DTI_VRX_DebugWrite(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_DebugWrite(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         DTI_H2D_DebugWrite_t *pInDbgSet,
                         IFX_uint32_t         *pOutDbgGet_nU,
@@ -3007,8 +2995,8 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugWrite(
 
    if (*pDbgWriteCount > pVrxDevCtx->numOfRegAccess)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx DebugWrite - line %d, count %d > max %d."DTI_CRLF,
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx DebugWrite - line %d, count %d > max %d."DSL_CPE_CRLF,
           lineNum, *pDbgWriteCount, pVrxDevCtx->numOfDebugAccess));
 
       *pDbgWriteCount = 0;
@@ -3019,14 +3007,14 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugWrite(
 
    if (DTI_DevOpen(pVrxDevCtx, pPacketError, lineNum) != IFX_SUCCESS)
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx DebugRead - device open error." DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx DebugRead - device open error." DSL_CPE_CRLF));
 
       *pDbgWriteCount = 0;
       return IFX_SUCCESS;
    }
 
-   DTI_MemSet(&dbgAcc, 0x00, sizeof(IOCTL_MEI_dbgAccess_t));
+   cpe_control_memset_s(&dbgAcc, sizeof(dbgAcc), 0x00, sizeof(IOCTL_MEI_dbgAccess_t));
    dbgAcc.count    = (*pDbgWriteCount > 0) ? ((unsigned int)*pDbgWriteCount) : 0;
    dbgAcc.dbgAddr  = (unsigned int) pInDbgSet->offset;
    dbgAcc.dbgDest  = (unsigned int) pInDbgSet->type;
@@ -3037,8 +3025,8 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugWrite(
                FIO_MEI_DBG_WRITE,
                (DSL_int_t)&dbgAcc)) < 0 )
    {
-      DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-         ("ERROR: Vrx DebugWrite - ioctl error."DTI_CRLF));
+      DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+         ("ERROR: Vrx DebugWrite - ioctl error."DSL_CPE_CRLF));
 
       *pDbgWriteCount = 0;
       *pPacketError = DTI_eErrPortOperation;
@@ -3051,7 +3039,7 @@ DTI_STATIC IFX_int_t DTI_VRX_DebugWrite(
    return IFX_SUCCESS;
 }
 
-DTI_STATIC IFX_int_t DTI_VRX_WinEasyCiAccess(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_WinEasyCiAccess(
                         DTI_DeviceCtx_t      *pDtiDevCtx,
                         IFX_int_t            lineNum,
                         const IFX_uint8_t    *pDataIn,
@@ -3061,8 +3049,8 @@ DTI_STATIC IFX_int_t DTI_VRX_WinEasyCiAccess(
                         DTI_PacketError_t    *pPacketError)
 {
 
-   DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-      ("ERROR: Vrx WinEasy Access - not supported."DTI_CRLF));
+   DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+      ("ERROR: Vrx WinEasy Access - not supported."DSL_CPE_CRLF));
 
    *pPacketError = DTI_eErrUnknown;
    return IFX_SUCCESS;
@@ -3092,7 +3080,7 @@ DTI_STATIC IFX_int_t DTI_VRX_WinEasyCiAccess(
    At first the device msg will be read out to free the internal driver buffer.
    This is done independant on the established connection.
 */
-DTI_STATIC IFX_int_t DTI_VRX_AutoMsgProcess(
+DSL_CPE_STATIC IFX_int_t DTI_VRX_AutoMsgProcess(
                         DTI_DeviceCtx_t         *pDtiDevCtx,
                         const DTI_Connection_t  *pDtiCon,
                         IFX_uint32_t            devSelectWait_ms,
@@ -3109,8 +3097,8 @@ DTI_STATIC IFX_int_t DTI_VRX_AutoMsgProcess(
       return IFX_SUCCESS;
    }
 
-   DTI_DevFdZero(&pVrxDevCtx->tmpDevFds);
-   retVal = DTI_DeviceSelect(
+   DSL_CPE_FD_ZERO(&pVrxDevCtx->tmpDevFds);
+   retVal = DSL_CPE_Select(
                (IFX_uint32_t)pVrxDevCtx->nfcMaxDevFd,
                &pVrxDevCtx->nfcDevFds, &pVrxDevCtx->tmpDevFds, devSelectWait_ms);
 
@@ -3128,7 +3116,7 @@ DTI_STATIC IFX_int_t DTI_VRX_AutoMsgProcess(
    {
       if (pVrxDevCtx->pDevFds[lineNum] != -1)
       {
-         if ( DTI_DevFdIsSet((IFX_uint32_t)pVrxDevCtx->pDevFds[lineNum], &pVrxDevCtx->tmpDevFds) )
+         if ( DSL_CPE_DevFdIsSet((IFX_uint32_t)pVrxDevCtx->pDevFds[lineNum], &pVrxDevCtx->tmpDevFds) )
          {
             retVal--;
             (void)DTI_autoMsgRecv( 
@@ -3142,8 +3130,8 @@ DTI_STATIC IFX_int_t DTI_VRX_AutoMsgProcess(
          break;
    }
 #else
-   DTI_PRN_USR_ERR_NL(DTI_VRX, DTI_PRN_LEVEL_ERR,
-      ("ERROR: Vrx Auto msg - not supported."DTI_CRLF));
+   DSL_CPE_PRN_USR_ERR_NL(DSL_CPE, DSL_PRN_LEVEL_ERR,
+      ("ERROR: Vrx Auto msg - not supported."DSL_CPE_CRLF));
 #endif /* !DTI_DONT_USE_PROTEXT */
 
    return IFX_SUCCESS;
diff --git a/src/dsl_cpe_linux.c b/src/dsl_cpe_linux.c
index d897c110413d82fe7ca00a49c6d236e09d1d93ca..93f157ad3c090c30a78c7b76eccfef1f28dbc409 100644
--- a/src/dsl_cpe_linux.c
+++ b/src/dsl_cpe_linux.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -52,7 +54,9 @@ static struct termios stored_stdout_settings;
 #define NL_DBG_MSG_GROUP             1
 #define MAX_MSG_SIZE_BYTES           256
 
+#ifndef DSL_CPE_DEBUG_DISABLE
 static void DSL_CPE_NlSendMsg(DSL_char_t* pMsg);
+#endif /* DSL_CPE_DEBUG_DISABLE */
 #endif
 
 #ifndef INCLUDE_DSL_CPE_IFXOS_SUPPORT
@@ -124,7 +128,8 @@ DSL_int_t DSL_CPE_Select(
          {
             if (read_fd_out != read_fd_in)
             {
-               memcpy(read_fd_out, read_fd_in, sizeof(DSL_CPE_fd_set_t));
+               cpe_control_memcpy_s(read_fd_out, sizeof(DSL_CPE_fd_set_t),
+                  read_fd_in, sizeof(DSL_CPE_fd_set_t));
             }
             return select(max_fd, read_fd_out, NULL, NULL, NULL);
          }
@@ -132,7 +137,8 @@ DSL_int_t DSL_CPE_Select(
          {
             if (read_fd_out != read_fd_in)
             {
-               memcpy(read_fd_out, read_fd_in, sizeof(DSL_CPE_fd_set_t));
+               cpe_control_memcpy_s(read_fd_out, sizeof(DSL_CPE_fd_set_t), 
+                  read_fd_in, sizeof(DSL_CPE_fd_set_t));
             }
             return select(max_fd, read_fd_out, NULL, NULL, &tv);
          }
@@ -141,12 +147,14 @@ DSL_int_t DSL_CPE_Select(
       {
          if (timeout_msec == (DSL_uint32_t)-1)
          {
-            memcpy(&tmp, read_fd_in, sizeof(DSL_CPE_fd_set_t));
+            cpe_control_memcpy_s(&tmp, sizeof(DSL_CPE_fd_set_t), 
+               read_fd_in, sizeof(DSL_CPE_fd_set_t));
             return select(max_fd, &tmp, NULL, NULL, NULL);
          }
          else
          {
-            memcpy(&tmp, read_fd_in, sizeof(DSL_CPE_fd_set_t));
+            cpe_control_memcpy_s(&tmp, sizeof(DSL_CPE_fd_set_t), 
+               read_fd_in, sizeof(DSL_CPE_fd_set_t));
             return select(max_fd, &tmp, NULL, NULL, &tv);
          }
       }
@@ -248,7 +256,11 @@ DSL_Error_t DSL_CPE_PipeCreate(DSL_char_t *pName)
       return DSL_ERR_MEMORY;
    }
 
-   strcpy(pipepath, SYS_PIPE_PREFIX"/");
+   memset(pipepath, 0, strlen(SYS_PIPE_PREFIX"/") + strlen(pName) + 1);
+   cpe_control_strncpy_s(pipepath,
+      strlen(SYS_PIPE_PREFIX"/") + strlen(pName) + 1,
+      SYS_PIPE_PREFIX"/",
+      strlen(SYS_PIPE_PREFIX"/"));
    /* try to create directory, ignore error designedly */
    mkdir(pipepath, S_IFDIR | 0777);
    strcat(pipepath, pName);
@@ -768,7 +780,8 @@ DSL_int32_t DSL_CPE_ThreadInit(
          memset(pThrCntrl, 0x00, sizeof(DSL_CPE_ThreadCtrl_t));
 
          /* set thread function arguments */
-         strncpy(pThrCntrl->thrParams.pName, pName, DSL_CPE_THREAD_NAME_LEN);
+         cpe_control_strncpy_s(pThrCntrl->thrParams.pName,
+            DSL_CPE_THREAD_NAME_LEN, pName, strlen(pName));
          pThrCntrl->thrParams.pName[DSL_CPE_THREAD_NAME_LEN-1] = 0;
          pThrCntrl->nPriority = nPriority;
          pThrCntrl->thrParams.nArg1 = nArg1;
@@ -1353,7 +1366,7 @@ DSL_Error_t DSL_CPE_SetEnv(const DSL_char_t *sName, const DSL_char_t *sValue)
       }
    }
 
-   sprintf(pEnvList->pEnvEntry, "%s=%s", sName, sValue != DSL_NULL ? sValue : "");
+   snprintf(pEnvList->pEnvEntry, namelen + DSL_CPE_MAX_ENV_VAR_LENGTH + 2, "%s=%s", sName, sValue != DSL_NULL ? sValue : "");
    putenv(pEnvList->pEnvEntry);
 #endif
 
@@ -1462,10 +1475,10 @@ DSL_Error_t DSL_CPE_System(const DSL_char_t *sCommand)
 */
 int DSL_CPE_debug_printf(DSL_char_t *fmt, ...)
 {
-   va_list ap;   /* points to each unnamed arg in turn */
    DSL_int_t nRet = 0;
 #ifdef INCLUDE_DSL_CPE_DEBUG_LOGGER_SUPPORT
 #ifndef DSL_CPE_DEBUG_DISABLE
+   va_list ap;   /* points to each unnamed arg in turn */
    IFX_char_t debugString[MAX_MSG_SIZE_BYTES + 1] = {0};
 
    /* add the debug string itself */
@@ -1484,15 +1497,18 @@ int DSL_CPE_debug_printf(DSL_char_t *fmt, ...)
    }
 #endif /* DSL_CPE_DEBUG_DISABLE */
 #else
+   va_list ap;   /* points to each unnamed arg in turn */
+
    va_start(ap, fmt);   /* set ap pointer to 1st unnamed arg */
    nRet = vprintf(fmt, ap);
    va_end(ap);
-#endif   
+#endif
 
    return nRet;
 }
 
 #ifdef INCLUDE_DSL_CPE_DEBUG_LOGGER_SUPPORT
+#ifndef DSL_CPE_DEBUG_DISABLE
 static void DSL_CPE_NlSendMsg(DSL_char_t* pMsg)
 {
    DSL_int_t nSockFd = -1;
@@ -1507,9 +1523,9 @@ static void DSL_CPE_NlSendMsg(DSL_char_t* pMsg)
       printf("could not open netlink socket");
       DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
         "could not open netlink socket" DSL_CPE_CRLF));
-        
+
       return;
-   }   
+   }
 
    /* source address */
    memset(&srcAddr, 0, sizeof(srcAddr));
@@ -1535,9 +1551,9 @@ static void DSL_CPE_NlSendMsg(DSL_char_t* pMsg)
    pNlMsgHdr->nlmsg_len = MAX_MSG_SIZE_BYTES;
    pNlMsgHdr->nlmsg_pid = getpid();
    pNlMsgHdr->nlmsg_flags = 1;
-   pNlMsgHdr->nlmsg_type = 0; 
-   
-   strcpy(NLMSG_DATA(pNlMsgHdr), pMsg);   
+   pNlMsgHdr->nlmsg_type = 0;
+
+   cpe_control_strncpy_s(NLMSG_DATA(pNlMsgHdr), NLMSG_SPACE(MAX_MSG_SIZE_BYTES), pMsg, strlen(pMsg));
 
    iov.iov_base = (void*) pNlMsgHdr;
    iov.iov_len = pNlMsgHdr->nlmsg_len;
@@ -1550,6 +1566,7 @@ static void DSL_CPE_NlSendMsg(DSL_char_t* pMsg)
 
    close(nSockFd);
 }
+#endif /* DSL_CPE_DEBUG_DISABLE */
 #endif
 
 /**
@@ -1597,8 +1614,11 @@ DSL_char_t* DSL_CPE_OwnAddrStringGet(DSL_void_t)
    nFd = socket(AF_INET, SOCK_DGRAM, 0);
    if (nFd != -1)
    {
+      memset(&ifr, 0x0, sizeof(struct ifreq));
+
       ifr.ifr_addr.sa_family = AF_INET;
-      strncpy(ifr.ifr_name, DSL_DEBUG_TOOL_INTERFACE_DEFAULT_IFACE, IFNAMSIZ-1);
+      cpe_control_strncpy_s(ifr.ifr_name, IFNAMSIZ-1, 
+         DSL_DEBUG_TOOL_INTERFACE_DEFAULT_IFACE, strlen(DSL_DEBUG_TOOL_INTERFACE_DEFAULT_IFACE));
       nErrCode = DSL_CPE_Ioctl(nFd, SIOCGIFADDR, (DSL_int_t) &ifr);
       close(nFd);
       if (nErrCode == 0)
@@ -1612,8 +1632,13 @@ DSL_char_t* DSL_CPE_OwnAddrStringGet(DSL_void_t)
 
    if (pString != DSL_NULL)
    {
-      strcpy (pString, inet_ntoa(
-        ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
+      memset(pString, 0,
+	     strlen(inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)) + 1);
+
+      cpe_control_strncpy_s(pString,
+         strlen(inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)) + 1,
+         inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr),
+         strlen(inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)));
    }
 
    return pString;
diff --git a/src/dsl_cpe_os.h b/src/dsl_cpe_os.h
index da5c31cd9093eb7ed23e5b524e6e941053f68c07..f14eb503b0898d15a9bea5cc0b9350eb215e3b18 100644
--- a/src/dsl_cpe_os.h
+++ b/src/dsl_cpe_os.h
@@ -1,7 +1,8 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2011 - 2014 Lantiq Deutschland GmbH
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -113,8 +114,59 @@ __attribute__ ((__format__ (__printf__, 1, 2)))
 #endif
 ;
 
+#define DSL_CPE
+
+#define DSL_CPE_PRN_USR_ERR_NL IFXOS_PRN_USR_ERR_NL
+
+#define DSL_CPE_STATIC static
+
 #if defined(USE_LIB_IFXOS) && (USE_LIB_IFXOS == 1)
 
+/**
+   Pointer Struct for alligned buffer allocation and access.
+*/
+typedef union
+{
+   IFX_uint8_t    *pUInt8;
+   IFX_uint16_t   *pUInt16;
+   IFX_uint32_t   *pUInt32;
+   IFX_ulong_t    *pULong;
+} DSL_PTR_U;
+
+/** NULL pointer */
+#ifndef IFX_NULL
+#define IFX_NULL         ((void *)0)
+#endif
+
+/**
+   This is the addr pointer datatype (On 32bit systems it is 4 byte wide).
+*/
+typedef IFX_ulong_t IFX_addr_t;
+
+#ifndef DSL_PTR_CAST_GET_ULONG
+#  define DSL_PTR_CAST_GET_ULONG(buffer_ptr) \
+                  /*lint -e{506} -e{826} */ \
+                  ( (sizeof(IFX_addr_t) == 4) ? \
+                     ((((IFX_addr_t)(buffer_ptr).pUInt8 & 0x03) != 0) ? IFX_NULL : (buffer_ptr).pULong) : \
+                     ((((IFX_addr_t)(buffer_ptr).pUInt8 & 0x07) != 0) ? IFX_NULL : (buffer_ptr).pULong) )
+#endif 
+
+#ifndef DSL_PTR_CAST_GET_UINT32
+#  define DSL_PTR_CAST_GET_UINT32(buffer_ptr) \
+                  ((((IFX_addr_t)(buffer_ptr).pUInt8 & 0x03) != 0) ? IFX_NULL : (buffer_ptr).pUInt32)
+#endif
+
+#ifndef DSL_PTR_CAST_GET_UINT16
+#  define DSL_PTR_CAST_GET_UINT16(buffer_ptr) \
+                  ((((IFX_addr_t)(buffer_ptr).pUInt8 & 0x03) != 0) ? IFX_NULL : (buffer_ptr).pUInt16)
+#endif
+
+#define DSL_PRN_LEVEL_HIGH          IFXOS_PRN_LEVEL_HIGH
+#define DSL_PRN_LEVEL_NORMAL        IFXOS_PRN_LEVEL_NORMAL
+#define DSL_PRN_LEVEL_LOW           IFXOS_PRN_LEVEL_LOW
+#define DSL_PRN_LEVEL_WRN           IFXOS_PRN_LEVEL_WRN
+#define DSL_PRN_LEVEL_ERR           IFXOS_PRN_LEVEL_ERR
+
 /*
    common defines - ifxos_common.h"
 */
@@ -153,6 +205,8 @@ __attribute__ ((__format__ (__printf__, 1, 2)))
 #define DSL_CPE_Free                     IFXOS_MemFree
 #endif
 
+#define DSL_CPE_StrLen                  strlen
+
 /*
    Function map - Device handling (open, close ...).
 */
@@ -171,6 +225,8 @@ __attribute__ ((__format__ (__printf__, 1, 2)))
 #define DSL_CPE_Write                   IFXOS_DeviceWrite
 #define DSL_CPE_Ioctl                   IFXOS_DeviceControl
 #define DSL_CPE_Select                  IFXOS_DeviceSelect
+#define DSL_CPE_DevFdSet                IFXOS_DevFdSet
+#define DSL_CPE_DevFdIsSet              IFXOS_DevFdIsSet
 #endif
 
 /*
diff --git a/src/dsl_cpe_safec_wrapper.h b/src/dsl_cpe_safec_wrapper.h
new file mode 100644
index 0000000000000000000000000000000000000000..0050ae615cb85a1825ab3a3bdf60d648c6a4ac7d
--- /dev/null
+++ b/src/dsl_cpe_safec_wrapper.h
@@ -0,0 +1,38 @@
+/******************************************************************************
+
+                     Copyright 2018 - 2019 Intel Corporation
+
+  For licensing information, see the file 'LICENSE' in the root folder of
+  this software module.
+
+******************************************************************************/
+
+#ifndef _SAFEC_WRAPPER_H
+#define _SAFEC_WRAPPER_H
+
+#if defined (SAFEC_SUPPORT) && (SAFEC_SUPPORT == 3)
+#include "safe_mem_lib.h"
+#include "safe_str_lib.h"
+
+#define cpe_control_memcpy_s memcpy_s
+#define cpe_control_memset_s memset_s
+#define cpe_control_strncpy_s strncpy_s
+
+#else
+
+#warning "Safe C library is not available!"
+
+#include <stddef.h>	/* size_t */
+static __inline__ size_t safec_wrapper_min(size_t a, size_t b)
+{
+   return a > b ? b : a;
+}
+
+#define cpe_control_memcpy_s(dest, destsz, src, srcsz) memcpy(dest, src, safec_wrapper_min(destsz,srcsz))
+#define cpe_control_memset_s(dest, destsz, src, srcsz) memset(dest, src, safec_wrapper_min(destsz,srcsz))
+#define cpe_control_strncpy_s(dest, destsz, src, srcsz) strncpy(dest, src, safec_wrapper_min(destsz,srcsz))
+
+#endif /* defined (SAFEC_SUPPORT) && (SAFEC_SUPPORT == 3) */
+
+#endif /* _SAFEC_WRAPPER_H */
+
diff --git a/src/dsl_cpe_simulator.c b/src/dsl_cpe_simulator.c
index a70bd62bee9f3f1011e119e87f630f107cad17de..003321829671dcbac09533336a13cbcd4bc0358a 100644
--- a/src/dsl_cpe_simulator.c
+++ b/src/dsl_cpe_simulator.c
@@ -1,5 +1,7 @@
 /******************************************************************************
 
+                     Copyright 2018, Intel Corporation
+
                           Copyright (c) 2007-2015
                      Lantiq Beteiligungs-GmbH & Co. KG
 
@@ -98,11 +100,16 @@ DSL_int_t DSL_SIM_Ioctl( void *pprivate, unsigned int cmd, unsigned int arg )
 
          memset(&(pData->data), 0, sizeof(pData->data));
          memset(&(pData->accessCtl), 0, sizeof(pData->accessCtl));
-         memcpy(pData->data.DSL_DriverVersionApi, verApi, sizeof(verApi));
-         memcpy(pData->data.DSL_ChipSetFWVersion, ver, sizeof(ver));
-         memcpy(pData->data.DSL_ChipSetHWVersion, ver, sizeof(ver));
-         memcpy(pData->data.DSL_ChipSetType, chip, sizeof(chip));
-         memcpy(pData->data.DSL_DriverVersionMeiBsp, ver, sizeof(ver));
+         cpe_control_memcpy_s(pData->data.DSL_DriverVersionApi, sizeof(pData->data.DSL_DriverVersionApi),
+            verApi, sizeof(verApi));
+         cpe_control_memcpy_s(pData->data.DSL_ChipSetFWVersion,sizeof(pData->data.DSL_ChipSetFWVersion),
+            ver, sizeof(ver));
+         cpe_control_memcpy_s(pData->data.DSL_ChipSetHWVersion, sizeof(pData->data.DSL_ChipSetHWVersion),
+            ver, sizeof(ver));
+         cpe_control_memcpy_s(pData->data.DSL_ChipSetType, sizeof(pData->data.DSL_ChipSetType),
+            chip, sizeof(chip));
+         cpe_control_memcpy_s(pData->data.DSL_DriverVersionMeiBsp, sizeof(pData->data.DSL_DriverVersionMeiBsp),
+            ver, sizeof(ver));
       }
       break;
 
diff --git a/src/dsl_cpe_status_parser.c b/src/dsl_cpe_status_parser.c
new file mode 100644
index 0000000000000000000000000000000000000000..78bc0ebd43e1cccd790b2a1e814c20f257d201f3
--- /dev/null
+++ b/src/dsl_cpe_status_parser.c
@@ -0,0 +1,6050 @@
+/******************************************************************************
+
+         Copyright (c) 2019 Intel Corporation
+
+  For licensing information, see the file 'LICENSE' in the root folder of
+  this software module.
+
+*******************************************************************************/
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+
+#include "json.h"
+#include "dsl_cpe_status_parser.h"
+#include "drv_dsl_cpe_api_ioctl.h"
+#include "drv_dsl_cpe_api.h"
+
+#undef DSL_CCA_DBG_BLOCK
+#define DSL_CCA_DBG_BLOCK DSL_CCA_DBG_APP
+
+#define STATUS_FILE_PATH_TMP "/tmp/dsl_cpe_control.status.tmp"
+#define STATUS_FILE_PATH "/var/dsl_cpe_control.status"
+
+#define SECTION_PATH_LENGTH 256
+
+/*
+   Definitions for status file parameters' update types,
+   to be used in different update functions in order to
+   determine which parameters need to be updated
+*/
+typedef enum
+{
+   DSL_UPDATE_TYPE_NONE, /* only for nodes with JSON object type */
+   DSL_UPDATE_TYPE_INIT, /* parameters to be updated during initialization */
+   DSL_UPDATE_TYPE_POLL, /* parameters to be updated on polling timer */
+   DSL_UPDATE_TYPE_EVENT /* parameters to be updated by events only */
+} DSL_CPE_StatusNodeUpdateType_t;
+
+/*
+   JSON Status File node definition
+*/
+typedef struct
+{
+   DSL_CPE_StatusNodeIdx_t eNodeIdx;
+   DSL_char_t jsonPath[SECTION_PATH_LENGTH];
+   json_type jsonType;
+   DSL_CPE_StatusNodeUpdateType_t eUpdateType;
+} DSL_CPE_JsonStatusNode_t;
+
+/*
+   JSON Status File entire structure definition (metadata),
+   to be used for creation of physical Status File as well as
+   for further operations
+*/
+static const DSL_CPE_JsonStatusNode_t jsonStatusNodes[] =
+{
+   { DSL_ROOT, "dsl",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+   /* common section */
+   { DSL_LINE_ENTRIES, "dsl.line_number_of_entries",
+      json_type_int, DSL_UPDATE_TYPE_INIT },
+   { DSL_CHANNEL_ENTRIES, "dsl.channel_number_of_entries",
+      json_type_int, DSL_UPDATE_TYPE_INIT },
+   { DSL_BND_GROUP_ENTRIES, "dsl.bonding_group_number_of_entries",
+      json_type_int, DSL_UPDATE_TYPE_INIT },
+   { DSL_API_VERSION, "dsl.api_version",
+      json_type_string, DSL_UPDATE_TYPE_INIT },
+   { DSL_MEI_VERSION, "dsl.mei_driver_version",
+      json_type_string, DSL_UPDATE_TYPE_INIT },
+   { DSL_HW_VERSION, "dsl.hardware_version",
+      json_type_string, DSL_UPDATE_TYPE_INIT },
+   { DSL_CHIPSET_TYPE, "dsl.chipset_type",
+      json_type_string, DSL_UPDATE_TYPE_INIT },
+   /* <dsl.status> section */
+   { DSL_STATUS, "dsl.status",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+   { DSL_STATUS_LINE, "dsl.status.line",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      /* <dsl.status.line.0> section */
+      { DSL_STATUS_LINE_0, "dsl.status.line.0",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_STATUS, "dsl.status.line.0.status",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_UPSTREAM, "dsl.status.line.0.upstream",
+         json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_FW_VERSION, "dsl.status.line.0.firmware_version",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_LINK_STATUS, "dsl.status.line.0.link_status",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_STD_SUPPORTED, "dsl.status.line.0.standards_supported",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTSE, "dsl.status.line.0.xtse",
+         json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_STD_USED, "dsl.status.line.0.standard_used",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTSE_USED, "dsl.status.line.0.xtse_used",
+         json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_ENCODING, "dsl.status.line.0.line_encoding",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_ALLOWED_PROFILES, "dsl.status.line.0.allowed_profiles",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_CURRENT_PROFILE, "dsl.status.line.0.current_profile",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_PWR_MGMT_STATE, "dsl.status.line.0.power_management_state",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_SUCC_FAIL_CAUSE, "dsl.status.line.0.success_failure_cause",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_LAST_STATE_TRANSM, "dsl.status.line.0.last_state_transmitted",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_LAST_STATE_TRANSM_US, "dsl.status.line.0.last_state_transmitted.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_LAST_STATE_TRANSM_DS, "dsl.status.line.0.last_state_transmitted.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_US0_MASK, "dsl.status.line.0.us0_mask",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_TRELLIS, "dsl.status.line.0.trellis",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_TRELLIS_US, "dsl.status.line.0.trellis.us",
+         json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_TRELLIS_DS, "dsl.status.line.0.trellis.ds",
+         json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_ACT_SNR_MODE, "dsl.status.line.0.act_snr_mode",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_ACT_SNR_MODE_US, "dsl.status.line.0.act_snr_mode.us",
+         json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_ACT_SNR_MODE_DS, "dsl.status.line.0.act_snr_mode.ds",
+         json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_LINE_NR, "dsl.status.line.0.line_number",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_MAX_BIT_RATE, "dsl.status.line.0.upstream_max_bit_rate",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_MAX_BIT_RATE_US, "dsl.status.line.0.upstream_max_bit_rate.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_MAX_BIT_RATE_DS, "dsl.status.line.0.upstream_max_bit_rate.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_NOISE_MARGIN, "dsl.status.line.0.upstream_noise_margin",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_NOISE_MARGIN_US, "dsl.status.line.0.upstream_noise_margin.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_NOISE_MARGIN_DS, "dsl.status.line.0.upstream_noise_margin.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_SNR_MPB, "dsl.status.line.0.snr_mpb",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_SNR_MPB_US, "dsl.status.line.0.snr_mpb.us",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_SNR_MPB_DS, "dsl.status.line.0.snr_mpb.ds",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_POWER, "dsl.status.line.0.upstream_power",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_POWER_US, "dsl.status.line.0.upstream_power.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_POWER_DS, "dsl.status.line.0.upstream_power.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTUR_VENDOR, "dsl.status.line.0.xtur_vendor",
+         json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTUR_COUNTRY, "dsl.status.line.0.xtur_country",
+         json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTUR_ANSI_STD, "dsl.status.line.0.xtur_ansi_std",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTUR_ANSI_REV, "dsl.status.line.0.xtur_ansi_rev",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTUC_VENDOR, "dsl.status.line.0.xtuc_vendor",
+         json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTUC_COUNTRY, "dsl.status.line.0.xtuc_country",
+         json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTUC_ANSI_STD, "dsl.status.line.0.xtuc_ansi_std",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_XTUC_ANSI_REV, "dsl.status.line.0.xtuc_ansi_rev",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_UPBOKLER_PB, "dsl.status.line.0.upbokler_pb",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_RXTHRSH_DS, "dsl.status.line.0.rxthrsh_ds",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_ACT_RA_MODE, "dsl.status.line.0.act_ra_mode",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_ACT_RA_MODE_US, "dsl.status.line.0.act_ra_mode.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_ACT_RA_MODE_DS, "dsl.status.line.0.act_ra_mode.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_SNR_MROC, "dsl.status.line.0.snr_mroc",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_SNR_MROC_US, "dsl.status.line.0.snr_mroc.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_SNR_MROC_DS, "dsl.status.line.0.snr_mroc.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_ATTENUATION, "dsl.status.line.0.attenuation",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_0_ATTENUATION_US, "dsl.status.line.0.attenuation.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_0_ATTENUATION_DS, "dsl.status.line.0.attenuation.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         /* <dsl.status.line.0.channel> section */
+         { DSL_STATUS_LINE_0_CHANNEL, "dsl.status.line.0.channel",
+            json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATUS_LINE_0_CHANNEL_STATUS, "dsl.status.line.0.channel.status",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_LINKENC_SUPP, "dsl.status.line.0.channel.link_encapsulation_supported",
+            json_type_string, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_LINKENC_USED, "dsl.status.line.0.channel.link_encapsulation_used",
+            json_type_string, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_LPATH, "dsl.status.line.0.channel.lpath",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_INTLVDEPTH, "dsl.status.line.0.channel.intlvdepth",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_INTLVBLOCK, "dsl.status.line.0.channel.intlvblock",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_ACT_INTERL_DELAY, "dsl.status.line.0.channel.actual_interleaving_delay",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_ACTINP, "dsl.status.line.0.channel.actinp",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_INPREPORT, "dsl.status.line.0.channel.inpreport",
+            json_type_boolean, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_NFEC, "dsl.status.line.0.channel.nfec",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_RFEC, "dsl.status.line.0.channel.rfec",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_LSYMB, "dsl.status.line.0.channel.lsymb",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_DATARATE, "dsl.status.line.0.channel.curr_rate",
+            json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATUS_LINE_0_CHANNEL_DATARATE_US, "dsl.status.line.0.channel.curr_rate.us",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_DATARATE_DS, "dsl.status.line.0.channel.curr_rate.ds",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_ACTNDR, "dsl.status.line.0.channel.actndr",
+            json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATUS_LINE_0_CHANNEL_ACTNDR_US, "dsl.status.line.0.channel.actndr.us",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_ACTNDR_DS, "dsl.status.line.0.channel.actndr.ds",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN, "dsl.status.line.0.channel.actinprein",
+            json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN_US, "dsl.status.line.0.channel.actinprein.us",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN_DS, "dsl.status.line.0.channel.actinprein.ds",
+            json_type_int, DSL_UPDATE_TYPE_POLL },
+      /* <dsl.status.line.1> section */
+      { DSL_STATUS_LINE_1, "dsl.status.line.1",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_STATUS, "dsl.status.line.1.status",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_UPSTREAM, "dsl.status.line.1.upstream",
+      json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_FW_VERSION, "dsl.status.line.1.firmware_version",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_LINK_STATUS, "dsl.status.line.1.link_status",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_STD_SUPPORTED, "dsl.status.line.1.standards_supported",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTSE, "dsl.status.line.1.xtse",
+      json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_STD_USED, "dsl.status.line.1.standard_used",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTSE_USED, "dsl.status.line.1.xtse_used",
+      json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_ENCODING, "dsl.status.line.1.line_encoding",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_ALLOWED_PROFILES, "dsl.status.line.1.allowed_profiles",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_CURRENT_PROFILE, "dsl.status.line.1.current_profile",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_PWR_MGMT_STATE, "dsl.status.line.1.power_management_state",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_SUCC_FAIL_CAUSE, "dsl.status.line.1.success_failure_cause",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_LAST_STATE_TRANSM, "dsl.status.line.1.last_state_transmitted",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_LAST_STATE_TRANSM_US, "dsl.status.line.1.last_state_transmitted.us",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_LAST_STATE_TRANSM_DS, "dsl.status.line.1.last_state_transmitted.ds",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_US0_MASK, "dsl.status.line.1.us0_mask",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_TRELLIS, "dsl.status.line.1.trellis",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_TRELLIS_US, "dsl.status.line.1.trellis.us",
+      json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_TRELLIS_DS, "dsl.status.line.1.trellis.ds",
+      json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_ACT_SNR_MODE, "dsl.status.line.1.act_snr_mode",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_ACT_SNR_MODE_US, "dsl.status.line.1.act_snr_mode.us",
+      json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_ACT_SNR_MODE_DS, "dsl.status.line.1.act_snr_mode.ds",
+      json_type_boolean, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_LINE_NR, "dsl.status.line.1.line_number",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_MAX_BIT_RATE, "dsl.status.line.1.upstream_max_bit_rate",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_MAX_BIT_RATE_US, "dsl.status.line.1.upstream_max_bit_rate.us",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_MAX_BIT_RATE_DS, "dsl.status.line.1.upstream_max_bit_rate.ds",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_NOISE_MARGIN, "dsl.status.line.1.upstream_noise_margin",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_NOISE_MARGIN_US, "dsl.status.line.1.upstream_noise_margin.us",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_NOISE_MARGIN_DS, "dsl.status.line.1.upstream_noise_margin.ds",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_SNR_MPB, "dsl.status.line.1.snr_mpb",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_SNR_MPB_US, "dsl.status.line.1.snr_mpb.us",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_SNR_MPB_DS, "dsl.status.line.1.snr_mpb.ds",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_POWER, "dsl.status.line.1.upstream_power",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_POWER_US, "dsl.status.line.1.upstream_power.us",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_POWER_DS, "dsl.status.line.1.upstream_power.ds",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTUR_VENDOR, "dsl.status.line.1.xtur_vendor",
+      json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTUR_COUNTRY, "dsl.status.line.1.xtur_country",
+      json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTUR_ANSI_STD, "dsl.status.line.1.xtur_ansi_std",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTUR_ANSI_REV, "dsl.status.line.1.xtur_ansi_rev",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTUC_VENDOR, "dsl.status.line.1.xtuc_vendor",
+      json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTUC_COUNTRY, "dsl.status.line.1.xtuc_country",
+      json_type_array, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTUC_ANSI_STD, "dsl.status.line.1.xtuc_ansi_std",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_XTUC_ANSI_REV, "dsl.status.line.1.xtuc_ansi_rev",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_UPBOKLER_PB, "dsl.status.line.1.upbokler_pb",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_RXTHRSH_DS, "dsl.status.line.1.rxthrsh_ds",
+      json_type_string, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_ACT_RA_MODE, "dsl.status.line.1.act_ra_mode",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_ACT_RA_MODE_US, "dsl.status.line.1.act_ra_mode.us",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_ACT_RA_MODE_DS, "dsl.status.line.1.act_ra_mode.ds",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_SNR_MROC, "dsl.status.line.1.snr_mroc",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_SNR_MROC_US, "dsl.status.line.1.snr_mroc.us",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_SNR_MROC_DS, "dsl.status.line.1.snr_mroc.ds",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_ATTENUATION, "dsl.status.line.1.attenuation",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATUS_LINE_1_ATTENUATION_US, "dsl.status.line.1.attenuation.us",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATUS_LINE_1_ATTENUATION_DS, "dsl.status.line.1.attenuation.ds",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+         /* <dsl.status.line.1.channel> section */
+         { DSL_STATUS_LINE_1_CHANNEL, "dsl.status.line.1.channel",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATUS_LINE_1_CHANNEL_STATUS, "dsl.status.line.1.channel.status",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_LINKENC_SUPP, "dsl.status.line.1.channel.link_encapsulation_supported",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_LINKENC_USED, "dsl.status.line.1.channel.link_encapsulation_used",
+         json_type_string, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_LPATH, "dsl.status.line.1.channel.lpath",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_INTLVDEPTH, "dsl.status.line.1.channel.intlvdepth",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_INTLVBLOCK, "dsl.status.line.1.channel.intlvblock",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_ACT_INTERL_DELAY, "dsl.status.line.1.channel.actual_interleaving_delay",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_ACTINP, "dsl.status.line.1.channel.actinp",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_INPREPORT, "dsl.status.line.1.channel.inpreport",
+         json_type_boolean, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_NFEC, "dsl.status.line.1.channel.nfec",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_RFEC, "dsl.status.line.1.channel.rfec",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_LSYMB, "dsl.status.line.1.channel.lsymb",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_DATARATE, "dsl.status.line.1.channel.curr_rate",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATUS_LINE_1_CHANNEL_DATARATE_US, "dsl.status.line.1.channel.curr_rate.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_DATARATE_DS, "dsl.status.line.1.channel.curr_rate.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_ACTNDR, "dsl.status.line.1.channel.actndr",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATUS_LINE_1_CHANNEL_ACTNDR_US, "dsl.status.line.1.channel.actndr.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_ACTNDR_DS, "dsl.status.line.1.channel.actndr.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN, "dsl.status.line.1.channel.actinprein",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN_US, "dsl.status.line.1.channel.actinprein.us",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN_DS, "dsl.status.line.1.channel.actinprein.ds",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+   { DSL_STATS, "dsl.stats",
+   json_type_object, DSL_UPDATE_TYPE_NONE },
+   { DSL_STATS_LINE, "dsl.stats.line",
+   json_type_object, DSL_UPDATE_TYPE_NONE },
+      /* <dsl.stats.line.0> section */
+      { DSL_STATS_LINE_0, "dsl.stats.line.0",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_0_TOTAL_START, "dsl.stats.line.0.total_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_SHOWTIME_START, "dsl.stats.line.0.showtime_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_LAST_SHOWTIME_START, "dsl.stats.line.0.last_showtime_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_CURRENT_DAY_START, "dsl.stats.line.0.current_day_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_QUARTER_HOUR_START, "dsl.stats.line.0.quarter_hour_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_TOTAL, "dsl.stats.line.0.total",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_0_TOTAL_ERR_SECS, "dsl.stats.line.0.total.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_TOTAL_SEV_ERR_SECS, "dsl.stats.line.0.total.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_SHOWTIME, "dsl.stats.line.0.showtime",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_0_SHOWTIME_ERR_SECS, "dsl.stats.line.0.showtime.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_SHOWTIME_SEV_ERR_SECS, "dsl.stats.line.0.showtime.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_LAST_SHOWTIME, "dsl.stats.line.0.last_showtime",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_0_LAST_SHOWTIME_ERR_SECS, "dsl.stats.line.0.last_showtime.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_LAST_SHOWTIME_SEV_ERR_SECS, "dsl.stats.line.0.last_showtime.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_CURRENT_DAY, "dsl.stats.line.0.current_day",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_0_CURRENT_DAY_ERR_SECS, "dsl.stats.line.0.current_day.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_CURRENT_DAY_SEV_ERR_SECS, "dsl.stats.line.0.current_day.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_QUARTER_HOUR, "dsl.stats.line.0.quarter_hour",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_0_QUARTER_HOUR_ERR_SECS, "dsl.stats.line.0.quarter_hour.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_0_QUARTER_HOUR_SEV_ERR_SECS, "dsl.stats.line.0.quarter_hour.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+         /* <dsl.stats.line.0.channel> section */
+         { DSL_STATS_LINE_0_CHANNEL, "dsl.stats.line.0.channel",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_0_CHANNEL_TOTAL_START, "dsl.stats.line.0.channel.total_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_SHOWTIME_START, "dsl.stats.line.0.channel.showtime_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_START, "dsl.stats.line.0.channel.last_showtime_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_START, "dsl.stats.line.0.channel.current_day_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_START, "dsl.stats.line.0.channel.quarter_hour_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_TOTAL, "dsl.stats.line.0.channel.total",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_FEC_ERRORS, "dsl.stats.line.0.channel.total.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_CRC_ERRORS, "dsl.stats.line.0.channel.total.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_FEC_ERRORS, "dsl.stats.line.0.channel.total.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_CRC_ERRORS, "dsl.stats.line.0.channel.total.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_HEC_ERRORS, "dsl.stats.line.0.channel.total.xtur_hex_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_HEC_ERRORS, "dsl.stats.line.0.channel.total.xtuc_hex_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_SHOWTIME, "dsl.stats.line.0.channel.showtime",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_FEC_ERRORS, "dsl.stats.line.0.channel.showtime.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_CRC_ERRORS, "dsl.stats.line.0.channel.showtime.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_FEC_ERRORS, "dsl.stats.line.0.channel.showtime.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_CRC_ERRORS, "dsl.stats.line.0.channel.showtime.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_HEC_ERRORS, "dsl.stats.line.0.channel.showtime.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_HEC_ERRORS, "dsl.stats.line.0.channel.showtime.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME, "dsl.stats.line.0.channel.last_showtime",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_FEC_ERRORS, "dsl.stats.line.0.channel.last_showtime.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_CRC_ERRORS, "dsl.stats.line.0.channel.last_showtime.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_FEC_ERRORS, "dsl.stats.line.0.channel.last_showtime.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_CRC_ERRORS, "dsl.stats.line.0.channel.last_showtime.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_HEC_ERRORS, "dsl.stats.line.0.channel.last_showtime.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_HEC_ERRORS, "dsl.stats.line.0.channel.last_showtime.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY, "dsl.stats.line.0.channel.current_day",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_FEC_ERRORS, "dsl.stats.line.0.channel.current_day.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_CRC_ERRORS, "dsl.stats.line.0.channel.current_day.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_FEC_ERRORS, "dsl.stats.line.0.channel.current_day.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_CRC_ERRORS, "dsl.stats.line.0.channel.current_day.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_HEC_ERRORS, "dsl.stats.line.0.channel.current_day.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_HEC_ERRORS, "dsl.stats.line.0.channel.current_day.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR, "dsl.stats.line.0.channel.quarter_hour",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_FEC_ERRORS, "dsl.stats.line.0.channel.quarter_hour.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_CRC_ERRORS, "dsl.stats.line.0.channel.quarter_hour.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_FEC_ERRORS, "dsl.stats.line.0.channel.quarter_hour.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_CRC_ERRORS, "dsl.stats.line.0.channel.quarter_hour.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_HEC_ERRORS, "dsl.stats.line.0.channel.quarter_hour.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_HEC_ERRORS, "dsl.stats.line.0.channel.quarter_hour.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+      /* <dsl.stats.line.1> section */
+      { DSL_STATS_LINE_1, "dsl.stats.line.1",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_1_TOTAL_START, "dsl.stats.line.1.total_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_SHOWTIME_START, "dsl.stats.line.1.showtime_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_LAST_SHOWTIME_START, "dsl.stats.line.1.last_showtime_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_CURRENT_DAY_START, "dsl.stats.line.1.current_day_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_QUARTER_HOUR_START, "dsl.stats.line.1.quarter_hour_start",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_TOTAL, "dsl.stats.line.1.total",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_1_TOTAL_ERR_SECS, "dsl.stats.line.1.total.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_TOTAL_SEV_ERR_SECS, "dsl.stats.line.1.total.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_SHOWTIME, "dsl.stats.line.1.showtime",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_1_SHOWTIME_ERR_SECS, "dsl.stats.line.1.showtime.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_SHOWTIME_SEV_ERR_SECS, "dsl.stats.line.1.showtime.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_LAST_SHOWTIME, "dsl.stats.line.1.last_showtime",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_1_LAST_SHOWTIME_ERR_SECS, "dsl.stats.line.1.last_showtime.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_LAST_SHOWTIME_SEV_ERR_SECS, "dsl.stats.line.1.last_showtime.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_CURRENT_DAY, "dsl.stats.line.1.current_day",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_1_CURRENT_DAY_ERR_SECS, "dsl.stats.line.1.current_day.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_CURRENT_DAY_SEV_ERR_SECS, "dsl.stats.line.1.current_day.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_QUARTER_HOUR, "dsl.stats.line.1.quarter_hour",
+      json_type_object, DSL_UPDATE_TYPE_NONE },
+      { DSL_STATS_LINE_1_QUARTER_HOUR_ERR_SECS, "dsl.stats.line.1.quarter_hour.errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+      { DSL_STATS_LINE_1_QUARTER_HOUR_SEV_ERR_SECS, "dsl.stats.line.1.quarter_hour.severely_errored_secs",
+      json_type_int, DSL_UPDATE_TYPE_POLL },
+         /* <dsl.stats.line.1.channel> section */
+         { DSL_STATS_LINE_1_CHANNEL, "dsl.stats.line.1.channel",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_1_CHANNEL_TOTAL_START, "dsl.stats.line.1.channel.total_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_SHOWTIME_START, "dsl.stats.line.1.channel.showtime_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_START, "dsl.stats.line.1.channel.last_showtime_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_START, "dsl.stats.line.1.channel.current_day_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_START, "dsl.stats.line.1.channel.quarter_hour_start",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_TOTAL, "dsl.stats.line.1.channel.total",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_FEC_ERRORS, "dsl.stats.line.1.channel.total.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_CRC_ERRORS, "dsl.stats.line.1.channel.total.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_FEC_ERRORS, "dsl.stats.line.1.channel.total.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_CRC_ERRORS, "dsl.stats.line.1.channel.total.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_HEC_ERRORS, "dsl.stats.line.1.channel.total.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_HEC_ERRORS, "dsl.stats.line.1.channel.total.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_SHOWTIME, "dsl.stats.line.1.channel.showtime",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_FEC_ERRORS, "dsl.stats.line.1.channel.showtime.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_CRC_ERRORS, "dsl.stats.line.1.channel.showtime.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_FEC_ERRORS, "dsl.stats.line.1.channel.showtime.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_CRC_ERRORS, "dsl.stats.line.1.channel.showtime.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_HEC_ERRORS, "dsl.stats.line.1.channel.showtime.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_HEC_ERRORS, "dsl.stats.line.1.channel.showtime.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME, "dsl.stats.line.1.channel.last_showtime",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_FEC_ERRORS, "dsl.stats.line.1.channel.last_showtime.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_CRC_ERRORS, "dsl.stats.line.1.channel.last_showtime.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_FEC_ERRORS, "dsl.stats.line.1.channel.last_showtime.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_CRC_ERRORS, "dsl.stats.line.1.channel.last_showtime.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_HEC_ERRORS, "dsl.stats.line.1.channel.last_showtime.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_HEC_ERRORS, "dsl.stats.line.1.channel.last_showtime.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY, "dsl.stats.line.1.channel.current_day",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_FEC_ERRORS, "dsl.stats.line.1.channel.current_day.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_CRC_ERRORS, "dsl.stats.line.1.channel.current_day.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_FEC_ERRORS, "dsl.stats.line.1.channel.current_day.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_CRC_ERRORS, "dsl.stats.line.1.channel.current_day.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_HEC_ERRORS, "dsl.stats.line.1.channel.current_day.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_HEC_ERRORS, "dsl.stats.line.1.channel.current_day.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR, "dsl.stats.line.1.channel.quarter_hour",
+         json_type_object, DSL_UPDATE_TYPE_NONE },
+         { DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_FEC_ERRORS, "dsl.stats.line.1.channel.quarter_hour.xtur_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_CRC_ERRORS, "dsl.stats.line.1.channel.quarter_hour.xtur_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_FEC_ERRORS, "dsl.stats.line.1.channel.quarter_hour.xtuc_fec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_CRC_ERRORS, "dsl.stats.line.1.channel.quarter_hour.xtuc_crc_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_HEC_ERRORS, "dsl.stats.line.1.channel.quarter_hour.xtur_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL },
+         { DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_HEC_ERRORS, "dsl.stats.line.1.channel.quarter_hour.xtuc_hec_errors",
+         json_type_int, DSL_UPDATE_TYPE_POLL }
+};
+static const DSL_uint32_t nNodesNum =
+   sizeof(jsonStatusNodes) / sizeof(jsonStatusNodes[0]);
+
+/*
+   main buffer to keep the status file in a json format
+   (this buffer will be kept for whole parser lifetime
+   in order to be updated and written down to the
+   destination file only in case of need - with this
+   approach no status file read operation is needed)
+*/
+static json_object *pJsonStatusRootObj = DSL_NULL;
+
+/*
+   This separator has to be defined as an array, because
+   it is used differently by some JSON functions
+*/
+static const char NODES_SEPARATOR[] = ".";
+
+/*
+   Ioctl flag struct declaration
+   (needed to avoid redundand IOCTL sending
+   for grouped parameters)
+*/
+typedef struct {
+   const DSL_int_t nIoctl;
+   DSL_boolean_t bIsSet;
+} DSL_CPE_IoctlFlag_t;
+
+/*
+   Ioctl flags definitions (separate flag for each IOCTL
+   that provides information for more then one parameter),
+   initially set to FALSE
+*/
+static DSL_CPE_IoctlFlag_t ioctlFlags[] =
+{
+   { DSL_FIO_LINE_STATE_GET, DSL_FALSE},
+   { DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET, DSL_FALSE },
+   { DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET, DSL_FALSE },
+   { DSL_FIO_LINE_FEATURE_STATUS_GET, DSL_FALSE },
+   { DSL_FIO_G997_LINE_STATUS_GET, DSL_FALSE },
+   { DSL_FIO_G997_LINE_INVENTORY_GET, DSL_FALSE },
+   { DSL_FIO_PM_CHANNEL_COUNTERS_TOTAL_GET, DSL_FALSE },
+   { DSL_FIO_PM_CHANNEL_COUNTERS_SHOWTIME_GET, DSL_FALSE},
+   { DSL_FIO_PM_CHANNEL_COUNTERS_15MIN_GET, DSL_FALSE},
+   { DSL_FIO_PM_LINE_SEC_COUNTERS_TOTAL_GET, DSL_FALSE },
+   { DSL_FIO_PM_LINE_SEC_COUNTERS_SHOWTIME_GET, DSL_FALSE },
+   { DSL_FIO_PM_LINE_SEC_COUNTERS_1DAY_GET, DSL_FALSE },
+   { DSL_FIO_PM_LINE_SEC_COUNTERS_15MIN_GET, DSL_FALSE },
+   { DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET, DSL_FALSE },
+   { DSL_FIO_G997_FRAMING_PARAMETER_STATUS_GET, DSL_FALSE },
+   { DSL_FIO_G997_CHANNEL_STATUS_GET, DSL_FALSE },
+   { DSL_FIO_PM_DATA_PATH_COUNTERS_TOTAL_GET, DSL_FALSE },
+   { DSL_FIO_PM_DATA_PATH_COUNTERS_SHOWTIME_GET, DSL_FALSE },
+   { DSL_FIO_PM_CHANNEL_COUNTERS_1DAY_GET, DSL_FALSE },
+   { DSL_FIO_PM_DATA_PATH_COUNTERS_1DAY_GET, DSL_FALSE },
+   { DSL_FIO_PM_DATA_PATH_COUNTERS_15MIN_GET, DSL_FALSE }
+};
+static const DSL_uint32_t nFlagsNum =
+   sizeof(ioctlFlags) / sizeof(ioctlFlags[0]);
+
+/*
+   Standards struct declaration for standard parameters
+*/
+typedef struct {
+   DSL_uint8_t nOctet;
+   DSL_uint8_t nBit;
+   DSL_char_t *sName;
+} DSL_CPE_Standarts_t;
+
+/*
+   Available standards definition
+*/
+static const DSL_CPE_Standarts_t standartsTable[] = {
+   { 0, XTSE_1_01_A_T1_413, ",T1.413" },
+   { 0, XTSE_1_02_C_TS_101388, ",ETSI_101_388" },
+   { 0, XTSE_1_03_A_1_NO | XTSE_1_04_A_1_O, ",G.992.1_Annex_A" },
+   { 0, XTSE_1_05_B_1_NO | XTSE_1_06_B_1_O, ",G.992.1_Annex_B" },
+   { 0, XTSE_1_07_C_1_NO | XTSE_1_08_C_1_O, ",G.992.1_Annex_C" },
+
+   { 1, XTSE_2_01_A_2_NO, ",G.992.2_Annex_A" },
+   { 1, XTSE_2_02_B_2_O, ",G.992.2_Annex_B" },
+   { 1, XTSE_2_03_C_2_NO | XTSE_2_04_C_2_O, ",G.992.2_Annex_C" },
+
+   { 2, XTSE_3_03_A_3_NO | XTSE_3_04_A_3_O, ",G.992.3_Annex_A" },
+   { 2, XTSE_3_05_B_3_NO | XTSE_3_06_B_3_O, ",G.992.3_Annex_B" },
+
+   { 3, XTSE_4_01_A_4_NO | XTSE_4_02_A_4_O, ",G.992.4_Annex_A" },
+   { 3, XTSE_4_05_I_3_NO | XTSE_4_06_I_3_O, ",G.992.3_Annex_I" },
+   { 3, XTSE_4_07_J_3_NO | XTSE_4_08_J_3_O, ",G.992.3_Annex_J" },
+
+   { 4, XTSE_5_01_I_4_NO | XTSE_5_02_I_4_O, ",G.992.4_Annex_I" },
+   { 4, XTSE_5_03_L_3_NO | XTSE_5_04_L_3_NO, ",G.992.3_Annex_L" },
+   { 4, XTSE_5_05_L_3_O | XTSE_5_06_L_3_O, ",G.992.3_Annex_L" },
+   { 4, XTSE_5_07_M_3_NO | XTSE_5_08_M_3_O, ",G.992.3_Annex_M" },
+
+   { 5, XTSE_6_01_A_5_NO | XTSE_6_02_A_5_O, ",G.992.5_Annex_A" },
+   { 5, XTSE_6_03_B_5_NO | XTSE_6_04_B_5_O, ",G.992.5_Annex_B" },
+   { 5, XTSE_6_07_I_5_NO | XTSE_6_08_I_5_O, ",G.992.5_Annex_I" },
+
+   { 6, XTSE_7_01_J_5_NO | XTSE_7_02_J_5_O, ",G.992.5_Annex_J" },
+   { 6, XTSE_7_03_M_5_NO | XTSE_7_04_M_5_O, ",G.992.5_Annex_M" },
+
+   { 7, XTSE_8_01_A, ",G.993.2_Annex_A" },
+   { 7, XTSE_8_02_B, ",G.993.2_Annex_B" },
+   { 7, XTSE_8_03_C, ",G.993.2_Annex_C" }
+};
+static const DSL_uint32_t nStandardsNum =
+   sizeof(standartsTable) / sizeof(standartsTable[0]);
+
+/*
+   Profiles definitions
+*/
+static const DSL_char_t *profilesTable[] =
+   { ",8a", ",8b", ",8c", ",8d", ",12a", ",12b", ",17a", ",30a", ",35b" };
+
+/*
+   Definitions for vendor and country id
+*/
+#define MAX_LEN_VENDOR_ID 4
+#define MAX_LEN_COUNTRY_ID 2
+
+/* Definitions for PM counters */
+#define DSL_PM_HISTORY_INTERVALS_NUM 2
+
+/**********************************************/
+/* start local function declarations          */
+/**********************************************/
+
+static DSL_void_t DSL_CPE_JsonStatusFileCreate();
+
+static json_object* DSL_CPE_JsonNodeParentGet(
+   json_object *pRoot,
+   const DSL_char_t *pSectionPath
+);
+
+static const DSL_char_t* DSL_CPE_JsonNodePathGet(
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx
+);
+
+static const DSL_char_t* DSL_CPE_JsonNodeNameGet(
+   const DSL_char_t* jsonPath
+);
+
+static DSL_boolean_t DSL_CPE_IsWithinSection(
+   const DSL_char_t* jsonPath,
+   const DSL_char_t* jsonSectionPath
+);
+
+static DSL_Error_t DSL_CPE_JsonInitParamsUpdate(
+   DSL_CPE_Control_Context_t *pContext
+);
+
+static DSL_Error_t DSL_CPE_JsonEvtParamsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx
+);
+
+static DSL_Error_t DSL_CPE_JsonPollParamsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eSectionIdx
+);
+
+static DSL_Error_t DSL_CPE_JsonParamsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx
+);
+
+static DSL_Error_t DSL_CPE_JsonStatusFileWrite(
+);
+
+static DSL_void_t DSL_CPE_JsonLineNrOfEntriesUpdate(
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelNrOfEntriesUpdate(
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonBndGroupNrOfEntriesUpdate(
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonApiVersionUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonMeiVersionUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonHwVersionUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChipsetTypeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonLineStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonUpstreamUpdate(
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonFwVersionUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonLinkStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonStdSupportedUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXtseConfigUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonStdUsedUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXtseStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonLineEncodingUpdate(
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonAllowedProfilesUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonCurrentProfileUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonPowerMgmtStateUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonSuccFailCauseUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonLastStateTransmUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonUs0MaskUpdate(
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonTrellisUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonActSnrModeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonLineNrUpdate(
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonMaxBitRateUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonNoiseMarginUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonPowerUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonAttenuationUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonSnrMpbUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXturVendorUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXturCountryUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXtucVendorUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXtucCountryUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXturAnsiStdUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXturAnsiRevUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXtucAnsiStdUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonXtucAnsiRevUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonActRaModeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonUpboklerPbUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonRxthrshDsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonSnrMrocUpdate(
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonTotalStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonShowtimeStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonLastShowtimeStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonCurrDayStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonQuarterHourStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonTotalErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonTotalSevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonShowtimeErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonShowtimeSevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonLastShowtimeErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonLastShowtimeSevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonCurrDayErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonCurrDaySevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonQuarterHourErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonQuarterHourSevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelDataRatesUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelLinkEncapSupportedUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelLinkEncapUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelFramingUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelActStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nAccessDir,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelActINPReportUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelCountersTotalUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelDataPathCountersTotalUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelCountersShowtimeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_uint32_t nHisotryInterval,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_uint32_t nHistoryInterval,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelCounters1DayUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelDataPathCounters1DayUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelCounters15MinUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath
+);
+
+static DSL_void_t DSL_CPE_JsonChannelDataPathCounters15MinUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_char_t* jsonPath
+);
+
+/**********************************************/
+/* start global function definitions          */
+/**********************************************/
+
+/*
+   For a detailed description of the function, please refer to the
+   description in the header file 'drv_cpe_status_parser.h'
+*/
+DSL_Error_t DSL_CPE_StatusFileInitialize(
+   DSL_CPE_Control_Context_t *pContext)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_StatusFileInitialize" DSL_CPE_CRLF));
+
+   DSL_CPE_JsonStatusFileCreate();
+
+   nErrorCode = DSL_CPE_JsonInitParamsUpdate(pContext);
+
+   if (nErrorCode == DSL_SUCCESS)
+   {
+      nErrorCode = DSL_CPE_JsonStatusFileWrite();
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_StatusFileInitialize, retCode=%d"
+      DSL_CPE_CRLF, nErrorCode));
+
+   return nErrorCode;
+}
+
+/*
+   For a detailed description of the function, please refer to the
+   description in the header file 'drv_cpe_status_parser.h'
+*/
+DSL_Error_t DSL_CPE_StatusFileEvtUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_StatusFileEvtUpdate, node=%d"
+      DSL_CPE_CRLF, (DSL_int_t)eNodeIdx));
+
+   nErrorCode = DSL_CPE_JsonEvtParamsUpdate(
+      pContext, eNodeIdx);
+
+   if (nErrorCode == DSL_SUCCESS)
+   {
+      nErrorCode = DSL_CPE_JsonStatusFileWrite();
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_StatusFileEvtUpdate, retCode=%d"
+      DSL_CPE_CRLF, nErrorCode));
+
+   return nErrorCode;
+}
+
+/*
+   For a detailed description of the function, please refer to the
+   description in the header file 'drv_cpe_status_parser.h'
+*/
+DSL_Error_t DSL_CPE_StatusFilePollUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t ePollSectionIdx)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS;
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "IN - DSL_CPE_StatusFilePollUpdate, section=%d"
+      DSL_CPE_CRLF, (DSL_int_t)ePollSectionIdx));
+
+   nErrorCode = DSL_CPE_JsonPollParamsUpdate(
+      pContext, ePollSectionIdx);
+
+   if (nErrorCode == DSL_SUCCESS)
+   {
+      nErrorCode = DSL_CPE_JsonStatusFileWrite();
+   }
+
+   DSL_CCA_DEBUG(DSL_CCA_DBG_MSG, (DSL_CPE_PREFIX
+      "OUT - DSL_CPE_StatusFilePollUpdate, retCode=%d"
+      DSL_CPE_CRLF, nErrorCode));
+
+   return nErrorCode;
+}
+
+/*********************************************/
+/* start local function definitions          */
+/*********************************************/
+
+/*
+   This function returns ioctl flag
+*/
+static DSL_Error_t DSL_CPE_IoctlFlagGet(
+   DSL_int_t nIoctl,
+   const DSL_CPE_IoctlFlag_t **ppIoctlFlag)
+{
+   DSL_Error_t nErrorCode = DSL_ERROR;
+
+   for (unsigned int i = 0; i < nFlagsNum; ++i)
+   {
+      if (ioctlFlags[i].nIoctl == nIoctl)
+      {
+         *ppIoctlFlag = &ioctlFlags[i];
+
+         /* flag found */
+         nErrorCode = DSL_SUCCESS;
+      }
+   }
+
+   return nErrorCode;
+}
+
+/*
+   This function toggles ioctl flag to TRUE
+*/
+static DSL_void_t DSL_CPE_IoctlFlagSet(
+   DSL_int_t nIoctl)
+{
+   DSL_CPE_IoctlFlag_t *pIoctlFlag = DSL_NULL;
+
+   if (DSL_CPE_IoctlFlagGet(nIoctl,
+         (const DSL_CPE_IoctlFlag_t**)&pIoctlFlag) == DSL_SUCCESS)
+   {
+      pIoctlFlag->bIsSet = DSL_TRUE;
+   }
+   else
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - Status Parser, DSL_CPE_IoctlFlagSet: flag not found!"
+         DSL_CPE_CRLF));
+   }
+}
+
+/*
+   This function returns current "is set" value of related ioctl flag
+*/
+static DSL_boolean_t DSL_CPE_IsIoctlFlagSet(DSL_int_t nIoctl)
+{
+   DSL_boolean_t bIsSet = DSL_FALSE;
+   const DSL_CPE_IoctlFlag_t *pIoctlFlag = DSL_NULL;
+
+   if (DSL_CPE_IoctlFlagGet(nIoctl, &pIoctlFlag) == DSL_SUCCESS)
+   {
+      bIsSet = pIoctlFlag->bIsSet;
+   }
+   else
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - Status Parser, DSL_CPE_IsIoctlFlagSet: flag not found!"
+         DSL_CPE_CRLF));
+   }
+
+   return bIsSet;
+}
+
+/*
+   This function toggles all ioctl flags back to FALSE
+*/
+static DSL_void_t DSL_CPE_IoctlFlagsReset()
+{
+   for (unsigned int i = 0; i < nFlagsNum; ++i)
+   {
+      ioctlFlags[i].bIsSet = DSL_FALSE;
+   }
+}
+
+/*
+   This function creates JSON status file and stores it in the
+   common JSON object for further use
+*/
+static DSL_void_t DSL_CPE_JsonStatusFileCreate()
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   pJsonStatusRootObj = json_object_new_object();
+
+   for (unsigned int i = 0; i < nNodesNum; ++i)
+   {
+      pParentObj = DSL_CPE_JsonNodeParentGet(
+         pJsonStatusRootObj, jsonStatusNodes[i].jsonPath);
+
+      /* to prevent json_object_object_add function from asserting */
+      if (pParentObj != DSL_NULL &&
+         json_object_get_type(pParentObj) == json_type_object)
+      {
+         switch (jsonStatusNodes[i].jsonType)
+         {
+         case json_type_object:
+            pNewObj = json_object_new_object();
+            break;
+         case json_type_array:
+            pNewObj = json_object_new_array();
+            break;
+         case json_type_string:
+            pNewObj = json_object_new_string("");
+            break;
+         case json_type_int:
+            pNewObj = json_object_new_int(0);
+            break;
+         default:
+            break;
+         }
+
+         if (pNewObj)
+         {
+            json_object_object_add(pParentObj,
+               DSL_CPE_JsonNodeNameGet(jsonStatusNodes[i].jsonPath), pNewObj);
+
+            pNewObj = DSL_NULL;
+         }
+      }
+   }
+}
+
+/*
+   This function returns parent node for the given json node
+*/
+static json_object* DSL_CPE_JsonNodeParentGet(
+   json_object *pRoot,
+   const DSL_char_t *pSectionPath)
+{
+   typedef struct
+   {
+      DSL_char_t *pName;
+      json_object *pJsonObj;
+   } DSL_CPE_JsonNode_t;
+   DSL_char_t inputPath[SECTION_PATH_LENGTH];
+   DSL_CPE_JsonNode_t visitedNode;
+   DSL_char_t *token = DSL_NULL;
+
+   memset(inputPath, 0, sizeof(inputPath));
+   cpe_control_strncpy_s(inputPath, sizeof(inputPath),
+      pSectionPath, sizeof(inputPath));
+
+   memset(&visitedNode, 0, sizeof(visitedNode));
+   visitedNode.pJsonObj = pRoot;
+
+   token = strtok(inputPath, NODES_SEPARATOR);
+   while (token)
+   {
+      visitedNode.pName = token;
+      json_object_object_foreach(visitedNode.pJsonObj, key, val)
+      {
+         if (strcmp(key, visitedNode.pName) == 0)
+         {
+            if (json_object_get_type(val) == json_type_object)
+            {
+               visitedNode.pJsonObj = val;
+            }
+            break;
+         }
+      }
+      token = strtok(NULL, NODES_SEPARATOR);
+   }
+
+   return visitedNode.pJsonObj;
+}
+
+/*
+   This function returns full json path for the given node index
+*/
+static const DSL_char_t* DSL_CPE_JsonNodePathGet(
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx)
+{
+   const DSL_char_t *sOutputPath = DSL_NULL;
+
+   for (unsigned int i = 0; i < nNodesNum; ++i)
+   {
+      if (jsonStatusNodes[i].eNodeIdx == eNodeIdx)
+      {
+         sOutputPath = jsonStatusNodes[i].jsonPath;
+         break;
+      }
+   }
+
+   return sOutputPath;
+}
+
+/*
+   This function returns key (last node) name for the given json path
+*/
+static const DSL_char_t* DSL_CPE_JsonNodeNameGet(
+   const DSL_char_t* jsonPath)
+{
+   const char *jsonLastNode =
+      strrchr(jsonPath, (int)NODES_SEPARATOR[0]);
+   return jsonLastNode ? jsonLastNode + 1 : jsonPath;
+}
+
+/*
+   This function checks if the given path is defined
+   withing the given section path
+*/
+static DSL_boolean_t DSL_CPE_IsWithinSection(
+   const DSL_char_t* jsonPath,
+   const DSL_char_t* jsonSectionPath)
+{
+   DSL_boolean_t bIsWithin = DSL_FALSE;
+
+   /* given section path is a substring of the given path */
+   if (strncmp(jsonPath, jsonSectionPath, strlen(jsonSectionPath)) == 0)
+   {
+      bIsWithin = DSL_TRUE;
+   }
+
+   return bIsWithin;
+}
+
+/*
+   This function triggers init type params update
+*/
+static DSL_Error_t DSL_CPE_JsonInitParamsUpdate(
+   DSL_CPE_Control_Context_t *pContext)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrorCode = DSL_SUCCESS;
+
+   if (pJsonStatusRootObj == DSL_NULL)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_CPE_JsonInitParamsUpdate: root object is NULL!"
+         DSL_CPE_CRLF));
+      return DSL_ERROR;
+   }
+
+   for (unsigned int i = 0; i < nNodesNum; ++i)
+   {
+      if (jsonStatusNodes[i].eUpdateType == DSL_UPDATE_TYPE_INIT)
+      {
+         nRet = DSL_CPE_JsonParamsUpdate(
+            pContext, jsonStatusNodes[i].eNodeIdx);
+
+         /* keep error code in case of any
+            failure and continue */
+         if (nRet != DSL_SUCCESS)
+         {
+            nErrorCode = nRet;
+         }
+
+      }
+   }
+
+   /* reset all IOCTL flags to FALSE */
+   DSL_CPE_IoctlFlagsReset();
+
+   return nErrorCode;
+}
+
+/*
+   This function triggers given evt type param update
+*/
+static DSL_Error_t DSL_CPE_JsonEvtParamsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS;
+
+   if (pJsonStatusRootObj == DSL_NULL)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_CPE_JsonEvtParamsUpdate: root object is NULL!"
+         DSL_CPE_CRLF));
+      return DSL_ERROR;
+   }
+
+   /* call update function for given node */
+   nErrorCode = DSL_CPE_JsonParamsUpdate(pContext, eNodeIdx);
+
+   /* reset all IOCTL flags to FALSE */
+   DSL_CPE_IoctlFlagsReset();
+
+   return nErrorCode;
+}
+
+/*
+   This function triggers polling type params update
+*/
+static DSL_Error_t DSL_CPE_JsonPollParamsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eSectionIdx)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrorCode = DSL_SUCCESS;
+   const DSL_char_t *jsonSectionPath = DSL_NULL;
+
+   if (pJsonStatusRootObj == DSL_NULL)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_CPE_JsonPollParamsUpdate: root object is NULL!"
+         DSL_CPE_CRLF));
+      return DSL_ERROR;
+   }
+
+   /* get given section path from the index */
+   jsonSectionPath = DSL_CPE_JsonNodePathGet(eSectionIdx);
+
+   /* update all poll type parameters witing given section */
+   if (jsonSectionPath != DSL_NULL)
+   {
+      for (unsigned int i = 0; i < nNodesNum; ++i)
+      {
+         if (DSL_CPE_IsWithinSection(
+               jsonStatusNodes[i].jsonPath, jsonSectionPath) &&
+            jsonStatusNodes[i].eUpdateType == DSL_UPDATE_TYPE_POLL)
+         {
+            nRet = DSL_CPE_JsonParamsUpdate(
+               pContext, jsonStatusNodes[i].eNodeIdx);
+
+            /* keep error code in case of any
+               failure and continue */
+            if (nRet != DSL_SUCCESS)
+            {
+               nErrorCode = nRet;
+            }
+         }
+      }
+   }
+
+   /* reset all IOCTL flags to FALSE */
+   DSL_CPE_IoctlFlagsReset();
+
+   return nErrorCode;
+}
+
+/*
+   This function triggers given param update for any update type
+*/
+static DSL_Error_t DSL_CPE_JsonParamsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS;
+   const DSL_char_t *jsonPath = DSL_NULL;
+
+   jsonPath = DSL_CPE_JsonNodePathGet(eNodeIdx);
+   if (jsonPath == DSL_NULL)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_CPE_JsonParamsUpdate: node index (%d) undefined!"
+         DSL_CPE_CRLF, (DSL_int_t)eNodeIdx));
+      return DSL_ERROR;
+   }
+
+   switch (eNodeIdx)
+   {
+   case DSL_LINE_ENTRIES:
+      DSL_CPE_JsonLineNrOfEntriesUpdate(jsonPath);
+      break;
+   case DSL_CHANNEL_ENTRIES:
+      DSL_CPE_JsonChannelNrOfEntriesUpdate(jsonPath);
+      break;
+   case DSL_BND_GROUP_ENTRIES:
+      DSL_CPE_JsonBndGroupNrOfEntriesUpdate(jsonPath);
+      break;
+   case DSL_API_VERSION:
+      DSL_CPE_JsonApiVersionUpdate(pContext, jsonPath);
+      break;
+   case DSL_MEI_VERSION:
+      DSL_CPE_JsonMeiVersionUpdate(pContext, jsonPath);
+      break;
+   case DSL_HW_VERSION:
+      DSL_CPE_JsonHwVersionUpdate(pContext, jsonPath);
+      break;
+   case DSL_CHIPSET_TYPE:
+      DSL_CPE_JsonChipsetTypeUpdate(pContext, jsonPath);
+      break;
+   /********************************/
+   /* <dsl.status.line.0> section: */
+   /********************************/
+      case DSL_STATUS_LINE_0_STATUS:
+         DSL_CPE_JsonLineStatusUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_UPSTREAM:
+         DSL_CPE_JsonUpstreamUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_FW_VERSION:
+         DSL_CPE_JsonFwVersionUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_LINK_STATUS:
+         DSL_CPE_JsonLinkStatusUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_STD_SUPPORTED:
+         DSL_CPE_JsonStdSupportedUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTSE:
+         DSL_CPE_JsonXtseConfigUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_STD_USED:
+         DSL_CPE_JsonStdUsedUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTSE_USED:
+         DSL_CPE_JsonXtseStatusUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_ENCODING:
+         DSL_CPE_JsonLineEncodingUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_ALLOWED_PROFILES:
+         DSL_CPE_JsonAllowedProfilesUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_CURRENT_PROFILE:
+         DSL_CPE_JsonCurrentProfileUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_PWR_MGMT_STATE:
+         DSL_CPE_JsonPowerMgmtStateUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_SUCC_FAIL_CAUSE:
+         DSL_CPE_JsonSuccFailCauseUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_LAST_STATE_TRANSM_US:
+         DSL_CPE_JsonLastStateTransmUpdate(
+            pContext,/*nDevice*/ 0, DSL_UPSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_LAST_STATE_TRANSM_DS:
+         DSL_CPE_JsonLastStateTransmUpdate(
+            pContext,/*nDevice*/ 0, DSL_DOWNSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_US0_MASK:
+         DSL_CPE_JsonUs0MaskUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_TRELLIS_US:
+         DSL_CPE_JsonTrellisUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_TRELLIS_DS:
+         DSL_CPE_JsonTrellisUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_ACT_SNR_MODE_US:
+         DSL_CPE_JsonActSnrModeUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_ACT_SNR_MODE_DS:
+         DSL_CPE_JsonActSnrModeUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_LINE_NR:
+         DSL_CPE_JsonLineNrUpdate(/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_MAX_BIT_RATE_US:
+         DSL_CPE_JsonMaxBitRateUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_MAX_BIT_RATE_DS:
+         DSL_CPE_JsonMaxBitRateUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_NOISE_MARGIN_US:
+         DSL_CPE_JsonNoiseMarginUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_NOISE_MARGIN_DS:
+         DSL_CPE_JsonNoiseMarginUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_SNR_MPB_US:
+         DSL_CPE_JsonSnrMpbUpdate(
+            pContext,/*nDevice*/ 0, DSL_UPSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_SNR_MPB_DS:
+         DSL_CPE_JsonSnrMpbUpdate(
+            pContext,/*nDevice*/ 0, DSL_DOWNSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_POWER_US:
+         DSL_CPE_JsonPowerUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_POWER_DS:
+         DSL_CPE_JsonPowerUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTUR_VENDOR:
+         DSL_CPE_JsonXturVendorUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTUR_COUNTRY:
+         DSL_CPE_JsonXturCountryUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTUR_ANSI_STD:
+         DSL_CPE_JsonXturAnsiStdUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTUR_ANSI_REV:
+         DSL_CPE_JsonXturAnsiRevUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTUC_VENDOR:
+         DSL_CPE_JsonXtucVendorUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTUC_COUNTRY:
+         DSL_CPE_JsonXtucCountryUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTUC_ANSI_STD:
+         DSL_CPE_JsonXtucAnsiStdUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_XTUC_ANSI_REV:
+         DSL_CPE_JsonXtucAnsiRevUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_UPBOKLER_PB:
+         DSL_CPE_JsonUpboklerPbUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_RXTHRSH_DS:
+         DSL_CPE_JsonRxthrshDsUpdate(pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_ACT_RA_MODE_US:
+         DSL_CPE_JsonActRaModeUpdate(
+            pContext,/*nDevice*/ 0, DSL_UPSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_ACT_RA_MODE_DS:
+         DSL_CPE_JsonActRaModeUpdate(
+            pContext,/*nDevice*/ 0, DSL_DOWNSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_SNR_MROC_US:
+         DSL_CPE_JsonSnrMrocUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_SNR_MROC_DS:
+         DSL_CPE_JsonSnrMrocUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_ATTENUATION_US:
+         DSL_CPE_JsonAttenuationUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_0_ATTENUATION_DS:
+         DSL_CPE_JsonAttenuationUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      /****************************************/
+      /* <dsl.status.line.0.channel> section: */
+      /****************************************/
+         case DSL_STATUS_LINE_0_CHANNEL_STATUS:
+            DSL_CPE_JsonChannelStatusUpdate(
+               pContext,/*nDevice*/ 0, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_LINKENC_SUPP:
+            DSL_CPE_JsonChannelLinkEncapSupportedUpdate(
+               pContext,/*nDevice*/ 0, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_LINKENC_USED:
+            DSL_CPE_JsonChannelLinkEncapUpdate(
+               pContext,/*nDevice*/ 0, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_LPATH:
+         case DSL_STATUS_LINE_0_CHANNEL_INTLVDEPTH:
+         case DSL_STATUS_LINE_0_CHANNEL_INTLVBLOCK:
+            DSL_CPE_JsonChannelFramingUpdate(
+               pContext,/*nDevice*/ 0, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_ACT_INTERL_DELAY:
+         case DSL_STATUS_LINE_0_CHANNEL_ACTINP:
+            DSL_CPE_JsonChannelActStatusUpdate(
+               pContext,/*nDevice*/ 0, DSL_DOWNSTREAM, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_INPREPORT:
+            DSL_CPE_JsonChannelActINPReportUpdate(
+               pContext,/*nDevice*/ 0, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_NFEC:
+         case DSL_STATUS_LINE_0_CHANNEL_RFEC:
+         case DSL_STATUS_LINE_0_CHANNEL_LSYMB:
+            DSL_CPE_JsonChannelFramingUpdate(
+               pContext,/*nDevice*/ 0, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_DATARATE:
+         case DSL_STATUS_LINE_0_CHANNEL_DATARATE_US:
+            /* if entire section selected (DSL_STATUS_LINE_0_CHANNEL_DATARATE)
+               adapt jsonPath to current case */
+            if (eNodeIdx == DSL_STATUS_LINE_0_CHANNEL_DATARATE)
+            {
+               jsonPath = DSL_CPE_JsonNodePathGet(
+                  DSL_STATUS_LINE_0_CHANNEL_DATARATE_US);
+            }
+            DSL_CPE_JsonChannelDataRatesUpdate(pContext,
+               /*nDevice*/ 0, DSL_UPSTREAM, jsonPath);
+            /* if selected only upstream node (instead of entire section
+               DSL_STATUS_LINE_0_CHANNEL_DATARATE) then break here, otherwise
+               continue and update also DATARATE_DS */
+            if (eNodeIdx == DSL_STATUS_LINE_0_CHANNEL_DATARATE_US)
+            {
+               break;
+            }
+         case DSL_STATUS_LINE_0_CHANNEL_DATARATE_DS:
+            /* if entire section selected (DSL_STATUS_LINE_0_CHANNEL_DATARATE)
+               adapt jsonPath to current case */
+            if (eNodeIdx == DSL_STATUS_LINE_0_CHANNEL_DATARATE)
+            {
+               jsonPath = DSL_CPE_JsonNodePathGet(
+                  DSL_STATUS_LINE_0_CHANNEL_DATARATE_DS);
+            }
+            DSL_CPE_JsonChannelDataRatesUpdate(
+               pContext, /*nDevice*/ 0, DSL_DOWNSTREAM, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_ACTNDR_US:
+         case DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN_US:
+            DSL_CPE_JsonChannelActStatusUpdate(
+               pContext,/*nDevice*/ 0, DSL_UPSTREAM, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATUS_LINE_0_CHANNEL_ACTNDR_DS:
+         case DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN_DS:
+            DSL_CPE_JsonChannelActStatusUpdate(
+               pContext,/*nDevice*/ 0, DSL_DOWNSTREAM, eNodeIdx, jsonPath);
+            break;
+   /********************************/
+   /* <dsl.status.line.1> section: */
+   /********************************/
+      case DSL_STATUS_LINE_1_STATUS:
+         DSL_CPE_JsonLineStatusUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_UPSTREAM:
+         DSL_CPE_JsonUpstreamUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_FW_VERSION:
+         DSL_CPE_JsonFwVersionUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_LINK_STATUS:
+         DSL_CPE_JsonLinkStatusUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_STD_SUPPORTED:
+         DSL_CPE_JsonStdSupportedUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTSE:
+         DSL_CPE_JsonXtseConfigUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_STD_USED:
+         DSL_CPE_JsonStdUsedUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTSE_USED:
+         DSL_CPE_JsonXtseStatusUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_ENCODING:
+         DSL_CPE_JsonLineEncodingUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_ALLOWED_PROFILES:
+         DSL_CPE_JsonAllowedProfilesUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_CURRENT_PROFILE:
+         DSL_CPE_JsonCurrentProfileUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_PWR_MGMT_STATE:
+         DSL_CPE_JsonPowerMgmtStateUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_SUCC_FAIL_CAUSE:
+         DSL_CPE_JsonSuccFailCauseUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_LAST_STATE_TRANSM_US:
+         DSL_CPE_JsonLastStateTransmUpdate(
+            pContext,/*nDevice*/ 1, DSL_UPSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_LAST_STATE_TRANSM_DS:
+         DSL_CPE_JsonLastStateTransmUpdate(
+            pContext,/*nDevice*/ 1, DSL_DOWNSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_US0_MASK:
+         DSL_CPE_JsonUs0MaskUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_TRELLIS_US:
+         DSL_CPE_JsonTrellisUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_TRELLIS_DS:
+         DSL_CPE_JsonTrellisUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_ACT_SNR_MODE_US:
+         DSL_CPE_JsonActSnrModeUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_ACT_SNR_MODE_DS:
+         DSL_CPE_JsonActSnrModeUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_LINE_NR:
+         DSL_CPE_JsonLineNrUpdate(/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_MAX_BIT_RATE_US:
+         DSL_CPE_JsonMaxBitRateUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_MAX_BIT_RATE_DS:
+         DSL_CPE_JsonMaxBitRateUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_NOISE_MARGIN_US:
+         DSL_CPE_JsonNoiseMarginUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_NOISE_MARGIN_DS:
+         DSL_CPE_JsonNoiseMarginUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_SNR_MPB_US:
+         DSL_CPE_JsonSnrMpbUpdate(
+            pContext,/*nDevice*/ 1, DSL_UPSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_SNR_MPB_DS:
+         DSL_CPE_JsonSnrMpbUpdate(
+            pContext,/*nDevice*/ 1, DSL_DOWNSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_POWER_US:
+         DSL_CPE_JsonPowerUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_POWER_DS:
+         DSL_CPE_JsonPowerUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTUR_VENDOR:
+         DSL_CPE_JsonXturVendorUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTUR_COUNTRY:
+         DSL_CPE_JsonXturCountryUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTUR_ANSI_STD:
+         DSL_CPE_JsonXturAnsiStdUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTUR_ANSI_REV:
+         DSL_CPE_JsonXturAnsiRevUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTUC_VENDOR:
+         DSL_CPE_JsonXtucVendorUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTUC_COUNTRY:
+         DSL_CPE_JsonXtucCountryUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTUC_ANSI_STD:
+         DSL_CPE_JsonXtucAnsiStdUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_XTUC_ANSI_REV:
+         DSL_CPE_JsonXtucAnsiRevUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_UPBOKLER_PB:
+         DSL_CPE_JsonUpboklerPbUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_RXTHRSH_DS:
+         DSL_CPE_JsonRxthrshDsUpdate(pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_ACT_RA_MODE_US:
+         DSL_CPE_JsonActRaModeUpdate(
+            pContext,/*nDevice*/ 1, DSL_UPSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_ACT_RA_MODE_DS:
+         DSL_CPE_JsonActRaModeUpdate(
+            pContext,/*nDevice*/ 1, DSL_DOWNSTREAM, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_SNR_MROC_US:
+         DSL_CPE_JsonSnrMrocUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_SNR_MROC_DS:
+         DSL_CPE_JsonSnrMrocUpdate(jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_ATTENUATION_US:
+         DSL_CPE_JsonAttenuationUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATUS_LINE_1_ATTENUATION_DS:
+         DSL_CPE_JsonAttenuationUpdate(pContext, eNodeIdx, jsonPath);
+         break;
+      /****************************************/
+      /* <dsl.status.line.1.channel> section: */
+      /****************************************/
+         case DSL_STATUS_LINE_1_CHANNEL_STATUS:
+            DSL_CPE_JsonChannelStatusUpdate(
+               pContext,/*nDevice*/ 1, jsonPath);
+            break;
+         case DSL_STATUS_LINE_1_CHANNEL_LINKENC_SUPP:
+            DSL_CPE_JsonChannelLinkEncapSupportedUpdate(
+               pContext,/*nDevice*/ 1, jsonPath);
+            break;
+         case DSL_STATUS_LINE_1_CHANNEL_LINKENC_USED:
+               DSL_CPE_JsonChannelLinkEncapUpdate(
+                  pContext,/*nDevice*/ 1, jsonPath);
+               break;
+         case DSL_STATUS_LINE_1_CHANNEL_LPATH:
+         case DSL_STATUS_LINE_1_CHANNEL_INTLVDEPTH:
+         case DSL_STATUS_LINE_1_CHANNEL_INTLVBLOCK:
+            DSL_CPE_JsonChannelFramingUpdate(
+               pContext,/*nDevice*/ 1, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATUS_LINE_1_CHANNEL_ACT_INTERL_DELAY:
+         case DSL_STATUS_LINE_1_CHANNEL_ACTINP:
+            DSL_CPE_JsonChannelActStatusUpdate(
+               pContext,/*nDevice*/ 1, DSL_DOWNSTREAM, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATUS_LINE_1_CHANNEL_INPREPORT:
+            DSL_CPE_JsonChannelActINPReportUpdate(
+               pContext,/*nDevice*/ 1, jsonPath);
+            break;
+         case DSL_STATUS_LINE_1_CHANNEL_NFEC:
+         case DSL_STATUS_LINE_1_CHANNEL_RFEC:
+         case DSL_STATUS_LINE_1_CHANNEL_LSYMB:
+            DSL_CPE_JsonChannelFramingUpdate(
+               pContext,/*nDevice*/ 1, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATUS_LINE_1_CHANNEL_DATARATE:
+         case DSL_STATUS_LINE_1_CHANNEL_DATARATE_US:
+            /* if entire section selected (DSL_STATUS_LINE_1_CHANNEL_DATARATE)
+               adapt jsonPath to current case */
+            if (eNodeIdx == DSL_STATUS_LINE_1_CHANNEL_DATARATE)
+            {
+               jsonPath = DSL_CPE_JsonNodePathGet(
+                  DSL_STATUS_LINE_1_CHANNEL_DATARATE_US);
+            }
+            DSL_CPE_JsonChannelDataRatesUpdate(pContext,
+               /*nDevice*/ 1, DSL_UPSTREAM, jsonPath);
+            /* if requested node is DSL_STATUS_LINE_1_CHANNEL_DATARATE
+            (entire section) then continue and update also DATARATE_DS */
+            if (eNodeIdx == DSL_STATUS_LINE_1_CHANNEL_DATARATE_US)
+            {
+               break;
+            }
+         case DSL_STATUS_LINE_1_CHANNEL_DATARATE_DS:
+            /* if entire section selected (DSL_STATUS_LINE_1_CHANNEL_DATARATE)
+               adapt jsonPath to current case */
+            if (eNodeIdx == DSL_STATUS_LINE_1_CHANNEL_DATARATE)
+            {
+               jsonPath = DSL_CPE_JsonNodePathGet(
+                  DSL_STATUS_LINE_1_CHANNEL_DATARATE_DS);
+            }
+            DSL_CPE_JsonChannelDataRatesUpdate(pContext,
+               /*nDevice*/ 1, DSL_DOWNSTREAM, jsonPath);
+            break;
+         case DSL_STATUS_LINE_1_CHANNEL_ACTNDR_US:
+         case DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN_US:
+            DSL_CPE_JsonChannelActStatusUpdate(
+               pContext,/*nDevice*/ 1, DSL_UPSTREAM, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATUS_LINE_1_CHANNEL_ACTNDR_DS:
+         case DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN_DS:
+            DSL_CPE_JsonChannelActStatusUpdate(
+               pContext,/*nDevice*/ 1, DSL_DOWNSTREAM, eNodeIdx, jsonPath);
+            break;
+   /********************************/
+   /* <dsl.stats.line.0> section: */
+   /********************************/
+      case DSL_STATS_LINE_0_TOTAL_START:
+         DSL_CPE_JsonTotalStartUpdate(
+            pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_SHOWTIME_START:
+         DSL_CPE_JsonShowtimeStartUpdate(
+            pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_LAST_SHOWTIME_START:
+         DSL_CPE_JsonLastShowtimeStartUpdate(
+            pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_CURRENT_DAY_START:
+         DSL_CPE_JsonCurrDayStartUpdate(
+            pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_QUARTER_HOUR_START:
+         DSL_CPE_JsonQuarterHourStartUpdate(
+            pContext,/*nDevice*/ 0, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_TOTAL_ERR_SECS:
+         DSL_CPE_JsonTotalErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_TOTAL_SEV_ERR_SECS:
+         DSL_CPE_JsonTotalSevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_SHOWTIME_ERR_SECS:
+         DSL_CPE_JsonShowtimeErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_SHOWTIME_SEV_ERR_SECS:
+         DSL_CPE_JsonShowtimeSevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_LAST_SHOWTIME_ERR_SECS:
+         DSL_CPE_JsonLastShowtimeErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_LAST_SHOWTIME_SEV_ERR_SECS:
+         DSL_CPE_JsonLastShowtimeSevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_CURRENT_DAY_ERR_SECS:
+         DSL_CPE_JsonCurrDayErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_CURRENT_DAY_SEV_ERR_SECS:
+         DSL_CPE_JsonCurrDaySevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_QUARTER_HOUR_ERR_SECS:
+         DSL_CPE_JsonQuarterHourErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_0_QUARTER_HOUR_SEV_ERR_SECS:
+         DSL_CPE_JsonQuarterHourSevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      /****************************************/
+      /* <dsl.stats.line.0.channel> section: */
+      /****************************************/
+         case DSL_STATS_LINE_0_CHANNEL_TOTAL_START:
+         case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersTotalUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersTotalUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersTotalUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersTotalUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_START:
+         case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END,
+               /*HistoryInterval*/ 0, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END,
+               /*HistoryInterval*/ 0, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_START:
+         case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END,
+               /*HistoryInterval*/ 1, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END,
+               /*HistoryInterval*/ 1, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END,
+               /*HistoryInterval*/ 0, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END,
+               /*HistoryInterval*/ 0, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END,
+               /*HistoryInterval*/ 1, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END,
+               /*HistoryInterval*/ 1, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_START:
+         case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCounters1DayUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCounters1DayUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCounters1DayUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCounters1DayUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_START:
+         case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCounters15MinUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCounters15MinUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCounters15MinUpdate(
+               pContext,/*nDevice*/ 0, DSL_NEAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCounters15MinUpdate(
+               pContext,/*nDevice*/ 0, DSL_FAR_END, jsonPath);
+            break;
+   /********************************/
+   /* <dsl.stats.line.1> section: */
+   /********************************/
+      case DSL_STATS_LINE_1_TOTAL_START:
+         DSL_CPE_JsonTotalStartUpdate(
+            pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_SHOWTIME_START:
+         DSL_CPE_JsonShowtimeStartUpdate(
+            pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_LAST_SHOWTIME_START:
+         DSL_CPE_JsonLastShowtimeStartUpdate(
+            pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_CURRENT_DAY_START:
+         DSL_CPE_JsonCurrDayStartUpdate(
+            pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_QUARTER_HOUR_START:
+         DSL_CPE_JsonQuarterHourStartUpdate(
+            pContext,/*nDevice*/ 1, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_TOTAL_ERR_SECS:
+         DSL_CPE_JsonTotalErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_TOTAL_SEV_ERR_SECS:
+         DSL_CPE_JsonTotalSevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_SHOWTIME_ERR_SECS:
+         DSL_CPE_JsonShowtimeErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_SHOWTIME_SEV_ERR_SECS:
+         DSL_CPE_JsonShowtimeSevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_LAST_SHOWTIME_ERR_SECS:
+         DSL_CPE_JsonLastShowtimeErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_LAST_SHOWTIME_SEV_ERR_SECS:
+         DSL_CPE_JsonLastShowtimeSevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_CURRENT_DAY_ERR_SECS:
+         DSL_CPE_JsonCurrDayErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_CURRENT_DAY_SEV_ERR_SECS:
+         DSL_CPE_JsonCurrDaySevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_QUARTER_HOUR_ERR_SECS:
+         DSL_CPE_JsonQuarterHourErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      case DSL_STATS_LINE_1_QUARTER_HOUR_SEV_ERR_SECS:
+         DSL_CPE_JsonQuarterHourSevErrSecsUpdate(
+            pContext, eNodeIdx, jsonPath);
+         break;
+      /****************************************/
+      /* <dsl.stats.line.1.channel> section: */
+      /****************************************/
+         case DSL_STATS_LINE_1_CHANNEL_TOTAL_START:
+         case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersTotalUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersTotalUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersTotalUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersTotalUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_START:
+         case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END,
+               /*HistoryInterval*/ 0, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END,
+               /*HistoryInterval*/ 0, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_START:
+         case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END,
+               /*HistoryInterval*/ 1, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END,
+               /*HistoryInterval*/ 1, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END,
+               /*HistoryInterval*/ 0, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END,
+               /*HistoryInterval*/ 0, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END,
+               /*HistoryInterval*/ 1, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END,
+               /*HistoryInterval*/ 1, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_START:
+         case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCounters1DayUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCounters1DayUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCounters1DayUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCounters1DayUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_START:
+         case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_CRC_ERRORS:
+            DSL_CPE_JsonChannelCounters15MinUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_FEC_ERRORS:
+         case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_CRC_ERRORS:
+            DSL_CPE_JsonChannelCounters15MinUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END, eNodeIdx, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCounters15MinUpdate(
+               pContext,/*nDevice*/ 1, DSL_NEAR_END, jsonPath);
+            break;
+         case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_HEC_ERRORS:
+            DSL_CPE_JsonChannelDataPathCounters15MinUpdate(
+               pContext,/*nDevice*/ 1, DSL_FAR_END, jsonPath);
+            break;
+   default:
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - Status Parser (DSL_CPE_JsonParamsUpdate): "
+         "unknown node!"
+         DSL_CPE_CRLF));
+      nErrorCode = DSL_ERROR;
+      break;
+   }
+
+   return nErrorCode;
+}
+
+static DSL_Error_t DSL_CPE_JsonStatusFileWrite()
+{
+   const DSL_char_t * pBufferOut = DSL_NULL;
+   DSL_CPE_File_t *pFile = DSL_NULL;
+
+   /* Write updated data to file */
+   pBufferOut = json_object_to_json_string_ext(pJsonStatusRootObj,
+      JSON_C_TO_STRING_PRETTY);
+   pFile = DSL_CPE_FOpen(STATUS_FILE_PATH_TMP, "w");
+   if (pFile == DSL_NULL)
+   {
+      DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+         "ERROR - DSL_CPE_JsonStatusFileWrite: failed to open status file!"
+         DSL_CPE_CRLF));
+      return DSL_ERROR;
+   }
+   DSL_CPE_FWrite(pBufferOut, sizeof(DSL_char_t), strlen(pBufferOut), pFile);
+   DSL_CPE_FClose(pFile);
+
+   /* execute atomic rename operation to store the status file in the final
+      destination and keep it locked as short as possible */
+   rename(STATUS_FILE_PATH_TMP, STATUS_FILE_PATH);
+
+   return DSL_SUCCESS;
+}
+
+/* --- Common section --- */
+
+static DSL_void_t DSL_CPE_JsonLineNrOfEntriesUpdate(
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_int(DSL_CPE_DSL_ENTITIES);
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonChannelNrOfEntriesUpdate(
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_int(DSL_CPE_CHANNELS_PER_LINE);
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonBndGroupNrOfEntriesUpdate(
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_int(DSL_CPE_BND_GROUP_ENTRIES);
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+/*
+   This function collects all version information needed
+   for common "version" parameters in the status tree
+   and keeps it in a static structure in order to not to
+   send IOCTL requests each time
+*/
+static const DSL_char_t* DSL_CPE_VersionInfoGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   static DSL_VersionInformation_t sVersionInfo = { 0 };
+   const char *sVersion = DSL_NULL;
+   const DSL_int_t nDevice = 0;
+
+   /* send IOCTL only if struct is zeroed (first execution)
+      or some parameters are not yet set (some information
+      can be available with delay, e.g. hw version is available
+      later, after FW DL) */
+   if ((eNodeIdx == DSL_API_VERSION && (
+         strlen(sVersionInfo.data.DSL_DriverVersionApi) == 0 ||
+         strcmp(sVersionInfo.data.DSL_DriverVersionApi, "n/a") == 0)) ||
+      (eNodeIdx == DSL_MEI_VERSION && (
+         strlen(sVersionInfo.data.DSL_DriverVersionMeiBsp) == 0 ||
+         strcmp(sVersionInfo.data.DSL_DriverVersionMeiBsp, "n/a") == 0)) ||
+      (eNodeIdx == DSL_HW_VERSION && (
+         strlen(sVersionInfo.data.DSL_ChipSetHWVersion) == 0 ||
+         strcmp(sVersionInfo.data.DSL_ChipSetHWVersion, "n/a") == 0)) ||
+      (eNodeIdx == DSL_CHIPSET_TYPE && (
+         strlen(sVersionInfo.data.DSL_ChipSetType) == 0 ||
+         strcmp(sVersionInfo.data.DSL_ChipSetType, "n/a") == 0)) ||
+      /* FW version can change in the runtime */
+      (eNodeIdx == DSL_STATUS_LINE_0_FW_VERSION ||
+            eNodeIdx == DSL_STATUS_LINE_1_FW_VERSION)
+      )
+   {
+      nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+         DSL_FIO_VERSION_INFORMATION_GET, (int)&sVersionInfo);
+
+      if (nRet < DSL_SUCCESS ||
+         sVersionInfo.accessCtl.nReturn < DSL_SUCCESS)
+      {
+         DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+            "ERROR - StatusParser, DSL_CPE_VersionInfoGet: "
+            "DSL_FIO_VERSION_INFORMATION_GET ioctl failed "
+            "(device<%d>, nRet = %d, accessCtrl = %d)!" DSL_CPE_CRLF,
+            nDevice, nRet, sVersionInfo.accessCtl.nReturn));
+      }
+   }
+
+   switch (eNodeIdx)
+   {
+      case DSL_API_VERSION:
+         sVersion = sVersionInfo.data.DSL_DriverVersionApi;
+         break;
+      case DSL_MEI_VERSION:
+         sVersion = sVersionInfo.data.DSL_DriverVersionMeiBsp;
+         break;
+      case DSL_HW_VERSION:
+         sVersion = sVersionInfo.data.DSL_ChipSetHWVersion;
+         break;
+      case DSL_CHIPSET_TYPE:
+         sVersion = sVersionInfo.data.DSL_ChipSetType;
+         break;
+      case DSL_STATUS_LINE_0_FW_VERSION:
+      case DSL_STATUS_LINE_1_FW_VERSION:
+         sVersion = sVersionInfo.data.DSL_ChipSetFWVersion;
+         break;
+      default:
+         DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+            "WARNING - StatusParser, DSL_CPE_VersionInfoGet: "
+            "unknown node!"
+            DSL_CPE_CRLF));
+         break;
+   }
+
+   return sVersion;
+}
+
+static DSL_void_t DSL_CPE_JsonApiVersionUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_string(
+      DSL_CPE_VersionInfoGet(pContext, DSL_API_VERSION));
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonMeiVersionUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_string(
+      DSL_CPE_VersionInfoGet(pContext, DSL_MEI_VERSION));
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonHwVersionUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_string(
+      DSL_CPE_VersionInfoGet(pContext, DSL_HW_VERSION));
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonChipsetTypeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_string(
+      DSL_CPE_VersionInfoGet(pContext, DSL_CHIPSET_TYPE));
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+/* --- Line section --- */
+
+/*
+   This function collects all data provided by
+   DSL_FIO_LINE_STATE_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_LineStateGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   DSL_LineStateValue_t *pLineState)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   static DSL_LineState_t lineData[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pLineState == DSL_NULL ||
+         nDevice >= DSL_CPE_DSL_ENTITIES)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_LINE_STATE_GET))
+   {
+      for (DSL_uint32_t nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_LINE_STATE_GET, (int)&lineData[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            lineData[nDev].accessCtl.nReturn != DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_LINE_STATE_GET ioctl failed "
+               "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+               nDev, nRet, lineData[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+
+         /* set ioctl flag only if all IOCTLs succeeded */
+         if (nErrorCode == DSL_SUCCESS)
+         {
+            DSL_CPE_IoctlFlagSet(DSL_FIO_LINE_STATE_GET);
+         }
+      }
+   }
+
+   /* provide data of corresponding IOCtl request */
+   *pLineState = lineData[nDevice].data.nLineState;
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonLineStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_LineStateValue_t nLineState = DSL_LINESTATE_NOT_INITIALIZED;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineStateGet(
+         pContext, nDevice, &nLineState) == DSL_SUCCESS)
+   {
+      switch (nLineState)
+      {
+      case DSL_LINESTATE_IDLE:
+      case DSL_LINESTATE_EXCEPTION:
+         pNewObj = json_object_new_string("DOWN");
+         break;
+      case DSL_LINESTATE_SILENT:
+         pNewObj = json_object_new_string("READY");
+         break;
+      case DSL_LINESTATE_HANDSHAKE:
+         pNewObj = json_object_new_string("HANDSHAKE");
+         break;
+      case DSL_LINESTATE_FULL_INIT:
+      case DSL_LINESTATE_SHOWTIME_NO_SYNC:
+         pNewObj = json_object_new_string("TRAINING");
+         break;
+      case DSL_LINESTATE_SHOWTIME_TC_SYNC:
+         pNewObj = json_object_new_string("UP");
+         break;
+      case DSL_LINESTATE_LOOPDIAGNOSTIC_ACTIVE:
+         pNewObj = json_object_new_string("LDM_ACTIVE");
+         break;
+      case DSL_LINESTATE_LOOPDIAGNOSTIC_COMPLETE:
+         pNewObj = json_object_new_string("LDM_COMPLETE");
+         break;
+      default:
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonUpstreamUpdate(
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_boolean(DSL_TRUE); /* always true */
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonFwVersionUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_string(
+      DSL_CPE_VersionInfoGet(pContext, eNodeIdx));
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonLinkStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_LineStateValue_t nLineState = DSL_LINESTATE_NOT_INITIALIZED;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineStateGet(
+         pContext, nDevice, &nLineState) == DSL_SUCCESS)
+   {
+      switch (nLineState)
+      {
+      case DSL_LINESTATE_NOT_INITIALIZED:
+      case DSL_LINESTATE_NOT_UPDATED:
+      case DSL_LINESTATE_DISABLED:
+      case DSL_LINESTATE_IDLE_REQUEST:
+         pNewObj = json_object_new_string("Initializing");
+         break;
+      case DSL_LINESTATE_IDLE:
+         pNewObj = json_object_new_string("Disabled");
+         break;
+      case DSL_LINESTATE_SHOWTIME_TC_SYNC:
+         pNewObj = json_object_new_string("Up");
+         break;
+      case DSL_LINESTATE_EXCEPTION:
+         pNewObj = json_object_new_string("Error");
+         break;
+      default:
+         pNewObj = json_object_new_string("EstablishingLink");
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_SystemEnablingConfigGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   DSL_uint8_t *pXTSE)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrorCode = DSL_SUCCESS;
+   static DSL_G997_XTUSystemEnabling_t
+      xtseData[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pXTSE == DSL_NULL ||
+         nDevice >= DSL_CPE_DSL_ENTITIES)
+   {
+      return DSL_ERROR;
+   }
+
+   /* avoid sending IOCTL many times in one status update iteration */
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET))
+   {
+      for (unsigned int nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET, (int)&xtseData[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            xtseData[nDev].accessCtl.nReturn < DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET ioctl "
+               "failed (device<%d>, nRet=%d, accessCtrl=%d)!"DSL_CPE_CRLF,
+               nDev, nRet, xtseData[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrorCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET);
+      }
+   }
+
+   /* get data for the given device */
+   for (unsigned int nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+   {
+      if (nDev == nDevice)
+      {
+         for (unsigned int i = 0; i < DSL_G997_NUM_XTSE_OCTETS; ++i)
+         {
+            pXTSE[i] = xtseData[nDev].data.XTSE[i];
+         }
+      }
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonStdSupportedUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   DSL_uint32_t nOffset = 0, nBufLen = 0, nOctet = 0, nBit = 0;
+   DSL_char_t sStandardsSupported[512] = "";
+   DSL_char_t *sStandardName = DSL_NULL;
+   DSL_uint8_t XTSE[DSL_G997_NUM_XTSE_OCTETS] = { 0 };
+
+   if (DSL_CPE_SystemEnablingConfigGet(
+         pContext, nDevice, XTSE) == DSL_SUCCESS)
+   {
+      nBufLen = sizeof(sStandardsSupported);
+      for (unsigned int i = 0; i < nStandardsNum; ++i)
+      {
+         nOctet = standartsTable[i].nOctet;
+         nBit = standartsTable[i].nBit;
+
+         if (XTSE[nOctet] & nBit)
+         {
+            /* select name from the table and exclude leading comma */
+            sStandardName = standartsTable[i].sName + ((nOffset) ? 0 : 1);
+            nBufLen = (sizeof(sStandardsSupported) > nOffset) ?
+               sizeof(sStandardsSupported) - nOffset : 0;
+            cpe_control_strncpy_s(sStandardsSupported + nOffset, nBufLen,
+               sStandardName, nBufLen);
+            nOffset += strlen(sStandardName);
+         }
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_string(sStandardsSupported);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonXtseConfigUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   DSL_uint8_t XTSE[DSL_G997_NUM_XTSE_OCTETS] = { 0 };
+
+   if (DSL_CPE_SystemEnablingConfigGet(
+         pContext, nDevice, XTSE) == DSL_SUCCESS)
+   {
+      /* create json array object */
+      pNewObj = json_object_new_array();
+
+      /* update json object */
+      for (unsigned int i = 0; i < DSL_G997_NUM_XTSE_OCTETS; i++)
+      {
+         json_object_array_add(pNewObj,
+            json_object_new_int(XTSE[i]));
+      }
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_SystemEnablingStatusGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   DSL_uint8_t *pXTSE)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrorCode = DSL_SUCCESS;
+   static DSL_G997_XTUSystemEnabling_t
+      xtseData[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pXTSE == DSL_NULL ||
+         nDevice >= DSL_CPE_DSL_ENTITIES)
+   {
+      return DSL_ERROR;
+   }
+
+   /* avoid sending IOCTL many times in one status update iteration */
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET))
+   {
+      for (unsigned int nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET, (int)&xtseData[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            xtseData[nDev].accessCtl.nReturn < DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET ioctl "
+               "failed (device<%d>, nRet=%d, accessCtrl=%d)!"DSL_CPE_CRLF,
+               nDev, nRet, xtseData[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrorCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET);
+      }
+   }
+
+   /* get data for the given device */
+   for (unsigned int nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+   {
+      if (nDev == nDevice)
+      {
+         for (unsigned int i = 0; i < DSL_G997_NUM_XTSE_OCTETS; ++i)
+         {
+            pXTSE[i] = xtseData[nDev].data.XTSE[i];
+         }
+      }
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonStdUsedUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   DSL_uint32_t nOctet = 0, nBits = 0;
+   DSL_char_t sStandardUsed[20] = "";
+   DSL_char_t *sStandardName = DSL_NULL;
+   DSL_uint8_t XTSE[DSL_G997_NUM_XTSE_OCTETS] = { 0 };
+
+   if (DSL_CPE_SystemEnablingStatusGet(
+         pContext, nDevice, XTSE) == DSL_SUCCESS)
+   {
+      for (unsigned int i = 0; i < nStandardsNum; ++i)
+      {
+         nOctet = standartsTable[i].nOctet;
+         nBits = standartsTable[i].nBit;
+
+         if (XTSE[nOctet] & nBits)
+         {
+            sStandardName = standartsTable[i].sName + 1;
+            cpe_control_strncpy_s(sStandardUsed, sizeof(sStandardUsed),
+               sStandardName, sizeof(sStandardUsed));
+            break;
+         }
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_string(sStandardUsed);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+
+static DSL_void_t DSL_CPE_JsonXtseStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   DSL_uint8_t XTSE[DSL_G997_NUM_XTSE_OCTETS] = { 0 };
+
+   if (DSL_CPE_SystemEnablingStatusGet(
+         pContext, nDevice, XTSE) == DSL_SUCCESS)
+   {
+      /* create json array object */
+      pNewObj = json_object_new_array();
+
+      /* update json object */
+      for (unsigned int i = 0; i < DSL_G997_NUM_XTSE_OCTETS; ++i)
+      {
+         json_object_array_add(pNewObj,
+            json_object_new_int(XTSE[i]));
+      }
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonLineEncodingUpdate(
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_string("DMT"); /* fixed value */
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonAllowedProfilesUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_BandPlanSupport_t profilesSupport = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   DSL_uint32_t nOffset = 0, nBufLen = 0;
+   DSL_char_t sAllowedProfiles[40] = "";
+   const DSL_char_t *sProfileName = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_BAND_PLAN_SUPPORT_GET, (int)&profilesSupport);
+   if (nRet == DSL_SUCCESS)
+   {
+      nBufLen = sizeof(sAllowedProfiles);
+      for (unsigned int i = 0; i < DSL_PROFILE_LAST; i++)
+      {
+         for (unsigned int j = 0; j < DSL_BANDPLAN_LAST; j++)
+         {
+            if (profilesSupport.data.bSupported[j][i])
+            {
+               /* select name from the table and exclude leading comma */
+               sProfileName = profilesTable[i] + ((nOffset) ? 0 : 1);
+               nBufLen = (sizeof(sAllowedProfiles) > nOffset) ?
+                  sizeof(sAllowedProfiles) - nOffset : 0;
+               cpe_control_strncpy_s(sAllowedProfiles + nOffset, nBufLen,
+                  sProfileName, nBufLen);
+               nOffset += strlen(sProfileName);
+
+               break;
+            }
+         }
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_string(sAllowedProfiles);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonCurrentProfileUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_BandPlanStatus_t profilesStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   DSL_char_t sCurrentProfile[5] = "";
+   const DSL_char_t *sProfileName = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_BAND_PLAN_STATUS_GET, (int)&profilesStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      for (unsigned int i = 0; i < DSL_PROFILE_LAST; i++)
+      {
+         if (i == profilesStatus.data.nProfile)
+         {
+            sProfileName = profilesTable[i] + 1;
+            cpe_control_strncpy_s(sCurrentProfile, sizeof(sCurrentProfile),
+               sProfileName, sizeof(sCurrentProfile));
+            break;
+         }
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_string(sCurrentProfile);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonPowerMgmtStateUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_G997_PowerManagementStatus_t powerStatus = { 0 };
+   DSL_char_t *powerTable[] = { "L0", "L1", "L2", "L3" };
+   DSL_char_t sPowerMgmtState[4] = "";
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_G997_POWER_MANAGEMENT_STATUS_GET, (int)&powerStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      for (unsigned int i = 0; i < sizeof(powerTable) / sizeof(char *); i++)
+      {
+         if (i == powerStatus.data.nPowerManagementStatus)
+         {
+            cpe_control_strncpy_s(sPowerMgmtState, sizeof(sPowerMgmtState),
+               powerTable[i], sizeof(sPowerMgmtState));
+            break;
+         }
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_string(sPowerMgmtState);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonSuccFailCauseUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_G997_LineInitStatus_t initStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_G997_LINE_INIT_STATUS_GET, (int)&initStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(initStatus.data.nLineInitStatus);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonLastStateTransmUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_G997_LastStateTransmitted_t lastState = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   lastState.nDirection = nDirection;
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_G997_LAST_STATE_TRANSMITTED_GET, (int)&lastState);
+   if (nRet == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(lastState.data.nLastStateTransmitted);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonUs0MaskUpdate(
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj =
+      json_object_new_int(0xF3F3); /* all types supported, use fixed value */
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_LINE_FEATURE_STATUS_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_LineFeatureStatusGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   DSL_boolean_t *pData)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrorCode = DSL_SUCCESS;
+   static DSL_LineFeature_t lineFeatureUs[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+   static DSL_LineFeature_t lineFeatureDs[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pData == DSL_NULL)
+   {
+      return DSL_ERROR;
+   }
+
+   /* avoid sending IOCTL many times in one status update iteration */
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_LINE_FEATURE_STATUS_GET))
+   {
+      for (unsigned int nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         lineFeatureUs[nDev].nDirection = DSL_UPSTREAM;
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_LINE_FEATURE_STATUS_GET, (int)&lineFeatureUs[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            lineFeatureUs[nDev].accessCtl.nReturn < DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_LINE_FEATURE_STATUS_GET(US) ioctl "
+               "failed (device<%d>, nRet=%d, accessCtrl=%d)!"DSL_CPE_CRLF,
+               nDev, nRet, lineFeatureUs[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+
+         lineFeatureDs[nDev].nDirection = DSL_DOWNSTREAM;
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_LINE_FEATURE_STATUS_GET, (int)&lineFeatureDs[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            lineFeatureDs[nDev].accessCtl.nReturn < DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_LINE_FEATURE_STATUS_GET(DS) ioctl "
+               "failed (device<%d>, nRet=%d, accessCtrl=%d)!"DSL_CPE_CRLF,
+               nDev, nRet, lineFeatureDs[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrorCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_LINE_FEATURE_STATUS_GET);
+      }
+   }
+
+   /* get data for the given node */
+   switch (eNodeIdx)
+   {
+      case DSL_STATUS_LINE_0_TRELLIS_US:
+         *pData = lineFeatureUs[/*nDevice*/0].data.bTrellisEnable;
+         break;
+      case DSL_STATUS_LINE_0_TRELLIS_DS:
+         *pData = lineFeatureDs[/*nDevice*/0].data.bTrellisEnable;
+         break;
+      case DSL_STATUS_LINE_1_TRELLIS_US:
+         *pData = lineFeatureUs[/*nDevice*/1].data.bTrellisEnable;
+         break;
+      case DSL_STATUS_LINE_1_TRELLIS_DS:
+         *pData = lineFeatureDs[/*nDevice*/1].data.bTrellisEnable;
+         break;
+      case DSL_STATUS_LINE_0_ACT_SNR_MODE_US:
+         *pData = lineFeatureUs[/*nDevice*/0].data.bVirtualNoiseSupport;
+         break;
+      case DSL_STATUS_LINE_0_ACT_SNR_MODE_DS:
+         *pData = lineFeatureDs[/*nDevice*/0].data.bVirtualNoiseSupport;
+         break;
+      case DSL_STATUS_LINE_1_ACT_SNR_MODE_US:
+         *pData = lineFeatureUs[/*nDevice*/1].data.bVirtualNoiseSupport;
+         break;
+      case DSL_STATUS_LINE_1_ACT_SNR_MODE_DS:
+         *pData = lineFeatureDs[/*nDevice*/1].data.bVirtualNoiseSupport;
+         break;
+      default:
+         break;
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonTrellisUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_boolean_t bTrellis = DSL_FALSE;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineFeatureStatusGet(
+         pContext, eNodeIdx, &bTrellis) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_boolean(bTrellis);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonActSnrModeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_boolean_t bActSnrMode = DSL_FALSE;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineFeatureStatusGet(
+      pContext, eNodeIdx, &bActSnrMode) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_boolean(bActSnrMode);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonLineNrUpdate(
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj =
+      json_object_new_int(nDevice);
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_G997_LINE_STATUS_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_G997LineStatusGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   DSL_uint32_t *pData)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrorCode = DSL_SUCCESS;
+   static DSL_G997_LineStatus_t
+      g997LineStatusUs[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+   static DSL_G997_LineStatus_t
+      g997LineStatusDs[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pData == DSL_NULL)
+   {
+      return DSL_ERROR;
+   }
+
+   /* avoid sending IOCTL many times in one status update iteration */
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_G997_LINE_STATUS_GET))
+   {
+      for (unsigned int nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         /*showtime, US */
+         g997LineStatusUs[nDev].nDeltDataType = DSL_DELT_DATA_SHOWTIME;
+         g997LineStatusUs[nDev].nDirection = DSL_UPSTREAM;
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_G997_LINE_STATUS_GET, (int)&g997LineStatusUs[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            g997LineStatusUs[nDev].accessCtl.nReturn < DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_G997_LINE_STATUS_GET(US) ioctl "
+               "failed (device<%d>, nRet=%d, accessCtrl=%d)!"DSL_CPE_CRLF,
+               nDev, nRet, g997LineStatusUs[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+
+         /* showtime, DS */
+         g997LineStatusDs[nDev].nDeltDataType = DSL_DELT_DATA_SHOWTIME;
+         g997LineStatusDs[nDev].nDirection = DSL_DOWNSTREAM;
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_G997_LINE_STATUS_GET, (int)&g997LineStatusDs[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            g997LineStatusDs[nDev].accessCtl.nReturn < DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_G997_LINE_STATUS_GET(DS) ioctl "
+               "failed (device<%d>, nRet=%d, accessCtrl=%d)!"DSL_CPE_CRLF,
+               nDev, nRet, g997LineStatusDs[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrorCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_G997_LINE_STATUS_GET);
+      }
+   }
+
+   /* get data for the given node */
+   switch (eNodeIdx)
+   {
+   case DSL_STATUS_LINE_0_MAX_BIT_RATE_US:
+      *pData = g997LineStatusUs[/*nDevice*/0].data.ATTNDR;
+      break;
+   case DSL_STATUS_LINE_0_MAX_BIT_RATE_DS:
+      *pData = g997LineStatusDs[/*nDevice*/0].data.ATTNDR;
+      break;
+   case DSL_STATUS_LINE_1_MAX_BIT_RATE_US:
+      *pData = g997LineStatusUs[/*nDevice*/1].data.ATTNDR;
+      break;
+   case DSL_STATUS_LINE_1_MAX_BIT_RATE_DS:
+      *pData = g997LineStatusDs[/*nDevice*/1].data.ATTNDR;
+      break;
+   case DSL_STATUS_LINE_0_NOISE_MARGIN_US:
+      *pData = g997LineStatusUs[/*nDevice*/0].data.SNR;
+      break;
+   case DSL_STATUS_LINE_0_NOISE_MARGIN_DS:
+      *pData = g997LineStatusDs[/*nDevice*/0].data.SNR;
+      break;
+   case DSL_STATUS_LINE_1_NOISE_MARGIN_US:
+      *pData = g997LineStatusUs[/*nDevice*/1].data.SNR;
+      break;
+   case DSL_STATUS_LINE_1_NOISE_MARGIN_DS:
+      *pData = g997LineStatusDs[/*nDevice*/1].data.SNR;
+      break;
+   case DSL_STATUS_LINE_0_POWER_US:
+      *pData = g997LineStatusUs[/*nDevice*/0].data.ACTATP;
+      break;
+   case DSL_STATUS_LINE_0_POWER_DS:
+      *pData = g997LineStatusDs[/*nDevice*/0].data.ACTATP;
+      break;
+   case DSL_STATUS_LINE_1_POWER_US:
+      *pData = g997LineStatusUs[/*nDevice*/1].data.ACTATP;
+      break;
+   case DSL_STATUS_LINE_1_POWER_DS:
+      *pData = g997LineStatusDs[/*nDevice*/1].data.ACTATP;
+      break;
+   case DSL_STATUS_LINE_0_ATTENUATION_US:
+      *pData = g997LineStatusUs[/*nDevice*/0].data.LATN;
+      break;
+   case DSL_STATUS_LINE_0_ATTENUATION_DS:
+      *pData = g997LineStatusDs[/*nDevice*/0].data.LATN;
+      break;
+   case DSL_STATUS_LINE_1_ATTENUATION_US:
+      *pData = g997LineStatusUs[/*nDevice*/1].data.LATN;
+      break;
+   case DSL_STATUS_LINE_1_ATTENUATION_DS:
+      *pData = g997LineStatusDs[/*nDevice*/1].data.LATN;
+      break;
+   default:
+      break;
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonMaxBitRateUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t nMaxBitRate = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997LineStatusGet(
+         pContext, eNodeIdx, &nMaxBitRate) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nMaxBitRate);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonNoiseMarginUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t nNoiseMargin = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997LineStatusGet(
+         pContext, eNodeIdx, &nNoiseMargin) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nNoiseMargin);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonPowerUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t nPower = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997LineStatusGet(
+         pContext, eNodeIdx, &nPower) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nPower);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonAttenuationUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t nAttenuation = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997LineStatusGet(
+         pContext, eNodeIdx, &nAttenuation) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nAttenuation);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonSnrMpbUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_uint32_t nOffset = 0, nBufSize = 0;
+   DSL_char_t sSnrMpbList[256] = "", sBuf[32] = "";
+   DSL_char_t *sSnrMpbName = DSL_NULL;
+   DSL_G997_LineStatusPerBand_t bandStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   bandStatus.nDirection = nDirection;
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_G997_LINE_STATUS_PER_BAND_GET, (int)&bandStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      nBufSize = sizeof(sSnrMpbList);
+      for (unsigned int i = 0; i < DSL_G997_MAX_NUMBER_OF_BANDS; ++i)
+      {
+         DSL_CPE_snprintf(sBuf, sizeof(sBuf), ",%d", bandStatus.data.SNR[i]);
+         /* select name from the buf and exclude leading comma */
+         sSnrMpbName = sBuf + ((nOffset) ? 0 : 1);
+         nBufSize =
+            (sizeof(sSnrMpbList) > nOffset) ?
+            sizeof(sSnrMpbList) - nOffset : 0;
+         cpe_control_strncpy_s(sSnrMpbList + nOffset, nBufSize,
+            sSnrMpbName, nBufSize);
+         nOffset += strlen(sSnrMpbName);
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_string(sSnrMpbList);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_G997_LINE_INVENTORY_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_G997LineInventoryGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   DSL_uint32_t *pData)
+{
+   DSL_Error_t nRet = DSL_SUCCESS, nErrorCode = DSL_SUCCESS;
+   static DSL_G997_LineInventory_t
+      g997LineInventoryNe[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+   static DSL_G997_LineInventory_t
+      g997LineInventoryFe[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pData == DSL_NULL)
+   {
+      return DSL_ERROR;
+   }
+
+   /* avoid sending IOCTL many times in one status update iteration */
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_G997_LINE_INVENTORY_GET))
+   {
+      for (unsigned int nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         g997LineInventoryNe[nDev].nDirection = DSL_NEAR_END;
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_G997_LINE_INVENTORY_GET, (int)&g997LineInventoryNe[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            g997LineInventoryNe[nDev].accessCtl.nReturn < DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_G997_LINE_INVENTORY_GET(NE) ioctl "
+               "failed (device<%d>, nRet=%d, accessCtrl=%d)!"DSL_CPE_CRLF,
+               nDev, nRet, g997LineInventoryNe[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+
+         g997LineInventoryFe[nDev].nDirection = DSL_FAR_END;
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_G997_LINE_INVENTORY_GET, (int)&g997LineInventoryFe[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            g997LineInventoryFe[nDev].accessCtl.nReturn < DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_G997_LINE_INVENTORY_GET(FE) ioctl "
+               "failed (device<%d>, nRet=%d, accessCtrl=%d)!"DSL_CPE_CRLF,
+               nDev, nRet, g997LineInventoryFe[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrorCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_G997_LINE_INVENTORY_GET);
+      }
+   }
+
+   /* get data for the given node */
+   switch (eNodeIdx)
+   {
+   case DSL_STATUS_LINE_0_XTUR_VENDOR:
+      pData[0] = g997LineInventoryNe[/*nDevice*/0].data.G994VendorID[2];
+      pData[1] = g997LineInventoryNe[/*nDevice*/0].data.G994VendorID[3];
+      pData[2] = g997LineInventoryNe[/*nDevice*/0].data.G994VendorID[4];
+      pData[3] = g997LineInventoryNe[/*nDevice*/0].data.G994VendorID[5];
+      break;
+   case DSL_STATUS_LINE_1_XTUR_VENDOR:
+      pData[0] = g997LineInventoryNe[/*nDevice*/1].data.G994VendorID[2];
+      pData[1] = g997LineInventoryNe[/*nDevice*/1].data.G994VendorID[3];
+      pData[2] = g997LineInventoryNe[/*nDevice*/1].data.G994VendorID[4];
+      pData[3] = g997LineInventoryNe[/*nDevice*/1].data.G994VendorID[5];
+      break;
+   case DSL_STATUS_LINE_0_XTUR_COUNTRY:
+      pData[0] = g997LineInventoryNe[/*nDevice*/0].data.G994VendorID[0];
+      pData[1] = g997LineInventoryNe[/*nDevice*/0].data.G994VendorID[1];
+      break;
+   case DSL_STATUS_LINE_1_XTUR_COUNTRY:
+      pData[0] = g997LineInventoryNe[/*nDevice*/1].data.G994VendorID[0];
+      pData[1] = g997LineInventoryNe[/*nDevice*/1].data.G994VendorID[1];
+      break;
+   case DSL_STATUS_LINE_0_XTUC_VENDOR:
+      pData[0] = g997LineInventoryFe[/*nDevice*/0].data.G994VendorID[2];
+      pData[1] = g997LineInventoryFe[/*nDevice*/0].data.G994VendorID[3];
+      pData[2] = g997LineInventoryFe[/*nDevice*/0].data.G994VendorID[4];
+      pData[3] = g997LineInventoryFe[/*nDevice*/0].data.G994VendorID[5];
+      break;
+   case DSL_STATUS_LINE_1_XTUC_VENDOR:
+      pData[0] = g997LineInventoryFe[/*nDevice*/1].data.G994VendorID[2];
+      pData[1] = g997LineInventoryFe[/*nDevice*/1].data.G994VendorID[3];
+      pData[2] = g997LineInventoryFe[/*nDevice*/1].data.G994VendorID[4];
+      pData[3] = g997LineInventoryFe[/*nDevice*/1].data.G994VendorID[5];
+      break;
+   case DSL_STATUS_LINE_0_XTUC_COUNTRY:
+      pData[0] = g997LineInventoryFe[/*nDevice*/0].data.G994VendorID[0];
+      pData[1] = g997LineInventoryFe[/*nDevice*/0].data.G994VendorID[1];
+      break;
+   case DSL_STATUS_LINE_1_XTUC_COUNTRY:
+      pData[0] = g997LineInventoryFe[/*nDevice*/1].data.G994VendorID[0];
+      pData[1] = g997LineInventoryFe[/*nDevice*/1].data.G994VendorID[1];
+      break;
+   default:
+      DSL_CCA_DEBUG(DSL_CCA_DBG_WRN, (DSL_CPE_PREFIX
+         "WARNING - StatusParser, DSL_CPE_G997LineInventoryGet: "
+         "unknown node!"
+         DSL_CPE_CRLF));
+      break;
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonXturVendorUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t nXturVendor[MAX_LEN_VENDOR_ID] = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997LineInventoryGet(
+      pContext, eNodeIdx, nXturVendor) == DSL_SUCCESS)
+   {
+      /* create json array object */
+      pNewObj = json_object_new_array();
+
+      /* update json object */
+      for (unsigned int i = 0; i < MAX_LEN_VENDOR_ID; i++)
+      {
+         json_object_array_add(pNewObj,
+            json_object_new_int(nXturVendor[i]));
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonXturCountryUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t nXturCountry[MAX_LEN_COUNTRY_ID] = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997LineInventoryGet(
+      pContext, eNodeIdx, nXturCountry) == DSL_SUCCESS)
+   {
+      /* create json array object */
+      pNewObj = json_object_new_array();
+
+      /* update json object */
+      for (unsigned int i = 0; i < MAX_LEN_COUNTRY_ID; i++)
+      {
+         json_object_array_add(pNewObj,
+            json_object_new_int(nXturCountry[i]));
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonXtucVendorUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t nXtucVendor[MAX_LEN_VENDOR_ID] = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997LineInventoryGet(
+      pContext, eNodeIdx, nXtucVendor) == DSL_SUCCESS)
+   {
+      /* create json array object */
+      pNewObj = json_object_new_array();
+
+      /* update json object */
+      for (unsigned int i = 0; i < MAX_LEN_VENDOR_ID; i++)
+      {
+         json_object_array_add(pNewObj,
+            json_object_new_int(nXtucVendor[i]));
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonXtucCountryUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t nXtucCountry[MAX_LEN_COUNTRY_ID] = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997LineInventoryGet(
+      pContext, eNodeIdx, nXtucCountry) == DSL_SUCCESS)
+   {
+      /* create json array object */
+      pNewObj = json_object_new_array();
+
+      /* update json object */
+      for (unsigned int i = 0; i < MAX_LEN_COUNTRY_ID; i++)
+      {
+         json_object_array_add(pNewObj,
+            json_object_new_int(nXtucCountry[i]));
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonXturAnsiStdUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_T1413RevisionStatus_t revisionStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_T1413_XTUR_REVISION_GET, (int)&revisionStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(revisionStatus.data.nT1413RevisionNum);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonXturAnsiRevUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_T1413VendorRevisionStatus_t vendorRevisionStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_T1413_XTUR_VENDOR_REVISION_GET, (int)&vendorRevisionStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(
+         vendorRevisionStatus.data.nT1413VendorRevisionNum);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonXtucAnsiStdUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_T1413RevisionStatus_t revisionStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_T1413_XTUO_REVISION_GET, (int)&revisionStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(revisionStatus.data.nT1413RevisionNum);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonXtucAnsiRevUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_T1413VendorRevisionStatus_t vendorRevisionStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_T1413_XTUO_VENDOR_REVISION_GET, (int)&vendorRevisionStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(
+         vendorRevisionStatus.data.nT1413VendorRevisionNum);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonUpboklerPbUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_uint32_t nOffset = 0, nBufSize = 0;
+   DSL_char_t sUpboklerPb[26] = "", sBuf[32] = "";
+   DSL_char_t *sUpboklerPbName = DSL_NULL;
+   DSL_G997_UsPowerBackOffStatus_t powerBackOffStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_G997_US_POWER_BACK_OFF_STATUS_GET, (int)&powerBackOffStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      nBufSize = sizeof(sUpboklerPb);
+      for (unsigned int i = 0; i < DSL_G997_MAX_NUMBER_OF_BANDS; ++i)
+      {
+         DSL_CPE_snprintf(sBuf, sizeof(sBuf), ",%hu",
+            powerBackOffStatus.data.nKl0EstimRPb[i]);
+         sBuf[5] = '\0';
+         /* select name from the buf and exclude leading comma */
+         sUpboklerPbName = sBuf + ((nOffset) ? 0 : 1);
+         nBufSize =
+            (sizeof(sUpboklerPb) > nOffset) ?
+            sizeof(sUpboklerPb) - nOffset : 0;
+         cpe_control_strncpy_s(sUpboklerPb + nOffset, nBufSize,
+            sUpboklerPbName, nBufSize);
+         nOffset += strlen(sUpboklerPbName);
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_string(sUpboklerPb);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonRxthrshDsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_uint32_t nOffset = 0, nBufSize = 0;
+   DSL_char_t sRxthrshDs[26] = "", sBuf[32] = "";
+   DSL_char_t *sRxthrshDsName = DSL_NULL;
+   DSL_G997_UsPowerBackOffStatus_t powerBackOffStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_G997_US_POWER_BACK_OFF_STATUS_GET, (int)&powerBackOffStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      nBufSize = sizeof(sRxthrshDs);
+      for (unsigned int i = 0; i < DSL_G997_MAX_NUMBER_OF_BANDS; ++i)
+      {
+         DSL_CPE_snprintf(sBuf, sizeof(sBuf), ",%hu",
+            powerBackOffStatus.data.nKl0EstimOPb[i]);
+         sBuf[5] = '\0';
+         /* select name from the buf and exclude leading comma */
+         sRxthrshDsName = sBuf + ((nOffset) ? 0 : 1);
+         nBufSize =
+            (sizeof(sRxthrshDs) > nOffset) ?
+            sizeof(sRxthrshDs) - nOffset : 0;
+         cpe_control_strncpy_s(sRxthrshDs + nOffset, nBufSize,
+            sRxthrshDsName, nBufSize);
+         nOffset += strlen(sRxthrshDsName);
+      }
+
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_string(sRxthrshDs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonActRaModeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_G997_RateAdaptationStatus_t rateAdaptationStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   rateAdaptationStatus.nDirection = nDirection;
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_G997_RATE_ADAPTATION_STATUS_GET, (int)&rateAdaptationStatus);
+   if (nRet == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(rateAdaptationStatus.data.RA_MODE);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonSnrMrocUpdate(
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj =
+      json_object_new_int(0); /* fixed value */
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_CHANNEL_COUNTERS_TOTAL_GET
+   IOCtl from all available devices and XTU directions.
+*/
+static DSL_Error_t DSL_CPE_PMCountersTotalGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nDirection,
+   DSL_PM_ChannelCountersTotal_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_XTUDir_t nDir = DSL_NEAR_END;
+   static DSL_PM_ChannelCountersTotal_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][(DSL_FAR_END + 1)] = { 0 };
+
+   if (pData == DSL_NULL ||
+      nDevice >= DSL_CPE_DSL_ENTITIES ||
+      nDirection == DSL_XTUDIR_NA)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_CHANNEL_COUNTERS_TOTAL_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_NEAR_END; nDir <= DSL_FAR_END; ++nDir)
+         {
+            sData[nDev][nDir].nDirection = nDir;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+               DSL_FIO_PM_CHANNEL_COUNTERS_TOTAL_GET,
+               (int)&sData[nDev][nDir]);
+
+            if (nRet < DSL_SUCCESS ||
+               sData[nDev][nDir].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_PM_CHANNEL_COUNTERS_TOTAL_GET ioctl failed "
+                  "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nRet, sData[nDev][nDir].accessCtl.nReturn));
+
+               nErrCode = DSL_ERROR;
+            }
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_CHANNEL_COUNTERS_TOTAL_GET);
+      }
+   }
+
+   *pData = sData[nDevice][nDirection];
+
+   return nErrCode;
+}
+
+static DSL_void_t DSL_CPE_JsonTotalStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_PM_ChannelCountersTotal_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMCountersTotalGet(
+         pContext, nDevice, DSL_NEAR_END, &data) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(data.total.nElapsedTime);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_CHANNEL_COUNTERS_SHOWTIME_GET
+   IOCtl from all available devices, history intervals and XTU directions.
+*/
+static DSL_Error_t DSL_CPE_PMCountersShowtimeGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nDirection,
+   const DSL_uint32_t nHistoryInterval,
+   DSL_PM_ChannelCounters_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_XTUDir_t nDir = DSL_NEAR_END;
+   DSL_uint32_t nHistInt = 0;
+   static DSL_PM_ChannelCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES]
+      [(DSL_FAR_END + 1)]
+   [DSL_PM_HISTORY_INTERVALS_NUM] = { 0 };
+
+   if (pData == DSL_NULL ||
+      nDevice >= DSL_CPE_DSL_ENTITIES ||
+      nDirection == DSL_XTUDIR_NA ||
+      nHistoryInterval >= DSL_PM_HISTORY_INTERVALS_NUM)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_CHANNEL_COUNTERS_SHOWTIME_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_NEAR_END; nDir <= DSL_FAR_END; ++nDir)
+         {
+            for (nHistInt = 0; nHistInt < DSL_PM_HISTORY_INTERVALS_NUM; ++nHistInt)
+            {
+               sData[nDev][nDir][nHistInt].nDirection = nDir;
+               sData[nDev][nDir][nHistInt].nHistoryInterval = nHistInt;
+
+               nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                  DSL_FIO_PM_CHANNEL_COUNTERS_SHOWTIME_GET,
+                  (int)&sData[nDev][nDir][nHistInt]);
+
+               if (nRet < DSL_SUCCESS ||
+                  sData[nDev][nDir][nHistInt].accessCtl.nReturn != DSL_SUCCESS)
+               {
+                  DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                     "ERROR - DSL_FIO_PM_CHANNEL_COUNTERS_SHOWTIME_GET "
+                     "ioctl failed (device<%d>, direction<%s>, "
+                     "historyInterval<%d>, nRet=%d, "
+                     "accessCtrl=%d)!" DSL_CPE_CRLF,
+                     nDev, (nDir == DSL_NEAR_END) ? "near end" : "far end",
+                     nHistInt, nRet,
+                     sData[nDev][nDir][nHistInt].accessCtl.nReturn));
+               }
+            }
+         }
+      }
+
+      /* no check for IOCTL failure here - it may happen that IOCTL failes
+         due to request for nHistoryInterval that was not yet reached */
+      DSL_CPE_IoctlFlagSet(DSL_FIO_PM_CHANNEL_COUNTERS_SHOWTIME_GET);
+   }
+
+   *pData = sData[nDevice][nDirection][nHistoryInterval];
+
+   return nErrCode;
+}
+
+static DSL_void_t DSL_CPE_JsonShowtimeStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_PM_ChannelCounters_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMCountersShowtimeGet(
+         pContext, nDevice, DSL_NEAR_END, /*HistoryInterval*/ 0, &data)
+      == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(data.interval.nElapsedTime);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonLastShowtimeStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_PM_ChannelCounters_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMCountersShowtimeGet(
+      pContext, nDevice, DSL_NEAR_END, /*HistoryInterval*/ 1, &data)
+      == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(data.interval.nElapsedTime);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonCurrDayStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_PM_LineInitCounters_t initCounters = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   nRet = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_PM_LINE_INIT_COUNTERS_1DAY_GET, (int)&initCounters);
+   if (nRet == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(initCounters.interval.nElapsedTime);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_CHANNEL_COUNTERS_15MIN_GET
+   IOCtl from all available devices and XTU directions.
+*/
+static DSL_Error_t DSL_CPE_PMCounters15MinGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nDirection,
+   DSL_PM_ChannelCounters_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_XTUDir_t nDir = DSL_NEAR_END;
+   static DSL_PM_ChannelCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][(DSL_FAR_END + 1)] = { 0 };
+
+   if (pData == DSL_NULL ||
+      nDevice >= DSL_CPE_DSL_ENTITIES ||
+      nDirection == DSL_XTUDIR_NA)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_CHANNEL_COUNTERS_15MIN_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_NEAR_END; nDir <= DSL_FAR_END; ++nDir)
+         {
+            sData[nDev][nDir].nHistoryInterval = 0;
+            sData[nDev][nDir].nDirection = nDir;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+               DSL_FIO_PM_CHANNEL_COUNTERS_15MIN_GET,
+               (int)&sData[nDev][nDir]);
+
+            if (nRet < DSL_SUCCESS ||
+               sData[nDev][nDir].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_PM_CHANNEL_COUNTERS_15MIN_GET ioctl failed "
+                  "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nRet, sData[nDev][nDir].accessCtl.nReturn));
+
+               nErrCode = DSL_ERROR;
+            }
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_CHANNEL_COUNTERS_15MIN_GET);
+      }
+   }
+
+   *pData = sData[nDevice][nDirection];
+
+   return nErrCode;
+}
+
+static DSL_void_t DSL_CPE_JsonQuarterHourStartUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_PM_ChannelCounters_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMCounters15MinGet(
+         pContext, nDevice, DSL_NEAR_END, &data)
+      == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(data.interval.nElapsedTime);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_LINE_SEC_COUNTERS_TOTAL_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_LineSecCountersTotalGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   DSL_int_t *pData)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   static DSL_PM_LineSecCountersTotal_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pData == DSL_NULL)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_LINE_SEC_COUNTERS_TOTAL_GET))
+   {
+      for (DSL_uint32_t nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         sData[nDev].nDirection = DSL_NEAR_END;
+
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_PM_LINE_SEC_COUNTERS_TOTAL_GET,
+            (int)&sData[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            sData[nDev].accessCtl.nReturn != DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_PM_LINE_SEC_COUNTERS_TOTAL_GET ioctl failed "
+               "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+               nDev, nRet, sData[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrorCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_LINE_SEC_COUNTERS_TOTAL_GET);
+      }
+   }
+
+   /* provide data of corresponding IOCtl request */
+   switch (eNodeIdx)
+   {
+   case DSL_STATS_LINE_0_TOTAL_ERR_SECS:
+      *pData = sData[/*nDevice*/0].data.nES;
+      break;
+   case DSL_STATS_LINE_0_TOTAL_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/0].data.nSES;
+      break;
+   case DSL_STATS_LINE_1_TOTAL_ERR_SECS:
+      *pData = sData[/*nDevice*/1].data.nES;
+      break;
+   case DSL_STATS_LINE_1_TOTAL_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/1].data.nSES;
+      break;
+   default:
+      break;
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonTotalErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nTotalErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCountersTotalGet(
+         pContext, eNodeIdx, &nTotalErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nTotalErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonTotalSevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nTotalSevErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCountersTotalGet(
+      pContext, eNodeIdx, &nTotalSevErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nTotalSevErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_LINE_SEC_COUNTERS_SHOWTIME_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_LineSecCountersShowtimeGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   DSL_int_t *pData)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   static DSL_PM_LineSecCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][DSL_PM_HISTORY_INTERVALS_NUM] = { 0 };
+
+   if (pData == DSL_NULL)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_LINE_SEC_COUNTERS_SHOWTIME_GET))
+   {
+      for (DSL_uint32_t nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (DSL_uint32_t nHistInt = 0;
+            nHistInt < DSL_PM_HISTORY_INTERVALS_NUM; ++nHistInt)
+         {
+            sData[nDev][nHistInt].nDirection = DSL_NEAR_END;
+            sData[nDev][nHistInt].nHistoryInterval = nHistInt;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+               DSL_FIO_PM_LINE_SEC_COUNTERS_SHOWTIME_GET,
+               (int)&sData[nDev][nHistInt]);
+
+            if (nRet < DSL_SUCCESS ||
+               sData[nDev][nHistInt].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_PM_LINE_SEC_COUNTERS_SHOWTIME_GET "
+                  "ioctl failed (device<%d>, historyInterval<%d>, "
+                  "nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nHistInt, nRet,
+                  sData[nDev][nHistInt].accessCtl.nReturn));
+            }
+         }
+      }
+
+      /* no check for IOCTL failure here - it may happen that IOCTL failes
+         due to request for nHistoryInterval that was not yet reached */
+      DSL_CPE_IoctlFlagSet(DSL_FIO_PM_LINE_SEC_COUNTERS_SHOWTIME_GET);
+   }
+
+   /* provide data of corresponding IOCtl request */
+   switch (eNodeIdx)
+   {
+   case DSL_STATS_LINE_0_SHOWTIME_ERR_SECS:
+      *pData = sData[/*nDevice*/0][/*HistoryInterval*/0].data.nES;
+      break;
+   case DSL_STATS_LINE_0_SHOWTIME_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/0][/*HistoryInterval*/0].data.nSES;
+      break;
+   case DSL_STATS_LINE_0_LAST_SHOWTIME_ERR_SECS:
+      *pData = sData[/*nDevice*/0][/*HistoryInterval*/1].data.nES;
+      break;
+   case DSL_STATS_LINE_0_LAST_SHOWTIME_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/0][/*HistoryInterval*/1].data.nSES;
+      break;
+   case DSL_STATS_LINE_1_SHOWTIME_ERR_SECS:
+      *pData = sData[/*nDevice*/1][/*HistoryInterval*/0].data.nES;
+      break;
+   case DSL_STATS_LINE_1_SHOWTIME_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/1][/*HistoryInterval*/0].data.nSES;
+      break;
+   case DSL_STATS_LINE_1_LAST_SHOWTIME_ERR_SECS:
+      *pData = sData[/*nDevice*/1][/*HistoryInterval*/1].data.nES;
+      break;
+   case DSL_STATS_LINE_1_LAST_SHOWTIME_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/1][/*HistoryInterval*/1].data.nSES;
+      break;
+   default:
+      break;
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonShowtimeErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nShowtimeErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCountersShowtimeGet(
+         pContext, eNodeIdx, &nShowtimeErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nShowtimeErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonShowtimeSevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nShowtimeSevErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCountersShowtimeGet(
+      pContext, eNodeIdx, &nShowtimeSevErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nShowtimeSevErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonLastShowtimeErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nLastShowtimeErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCountersShowtimeGet(
+         pContext, eNodeIdx, &nLastShowtimeErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nLastShowtimeErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonLastShowtimeSevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nLastShowtimeSevErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCountersShowtimeGet(
+         pContext, eNodeIdx, &nLastShowtimeSevErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nLastShowtimeSevErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_LINE_SEC_COUNTERS_1DAY_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_LineSecCounters1DayGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   DSL_int_t *pData)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   static DSL_PM_LineSecCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pData == DSL_NULL)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_LINE_SEC_COUNTERS_1DAY_GET))
+   {
+      for (DSL_uint32_t nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         sData[nDev].nDirection = DSL_NEAR_END;
+         sData[nDev].nHistoryInterval = 0;
+
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_PM_LINE_SEC_COUNTERS_1DAY_GET,
+            (int)&sData[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            sData[nDev].accessCtl.nReturn != DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_PM_LINE_SEC_COUNTERS_1DAY_GET ioctl failed "
+               "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+               nDev, nRet, sData[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrorCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_LINE_SEC_COUNTERS_1DAY_GET);
+      }
+   }
+
+   /* provide data of corresponding IOCtl request */
+   switch (eNodeIdx)
+   {
+   case DSL_STATS_LINE_0_CURRENT_DAY_ERR_SECS:
+      *pData = sData[/*nDevice*/0].data.nES;
+      break;
+   case DSL_STATS_LINE_0_CURRENT_DAY_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/0].data.nSES;
+      break;
+   case DSL_STATS_LINE_1_CURRENT_DAY_ERR_SECS:
+      *pData = sData[/*nDevice*/1].data.nES;
+      break;
+   case DSL_STATS_LINE_1_CURRENT_DAY_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/1].data.nSES;
+      break;
+   default:
+      break;
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonCurrDayErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nCurrDayErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCounters1DayGet(
+         pContext, eNodeIdx, &nCurrDayErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nCurrDayErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonCurrDaySevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nCurrDaySevErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCounters1DayGet(
+         pContext, eNodeIdx, &nCurrDaySevErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nCurrDaySevErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_LINE_SEC_COUNTERS_15MIN_GET
+   ioctl for all devices
+*/
+static DSL_Error_t DSL_CPE_LineSecCounters15MinGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   DSL_int_t *pData)
+{
+   DSL_Error_t nErrorCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   static DSL_PM_LineSecCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pData == DSL_NULL)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_LINE_SEC_COUNTERS_15MIN_GET))
+   {
+      for (DSL_uint32_t nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         sData[nDev].nDirection = DSL_NEAR_END;
+         sData[nDev].nHistoryInterval = 0;
+
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+            DSL_FIO_PM_LINE_SEC_COUNTERS_15MIN_GET,
+            (int)&sData[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+            sData[nDev].accessCtl.nReturn != DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_PM_LINE_SEC_COUNTERS_15MIN_GET ioctl failed "
+               "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+               nDev, nRet, sData[nDev].accessCtl.nReturn));
+
+            nErrorCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrorCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_LINE_SEC_COUNTERS_15MIN_GET);
+      }
+   }
+
+   /* provide data of corresponding IOCtl request */
+   switch (eNodeIdx)
+   {
+   case DSL_STATS_LINE_0_QUARTER_HOUR_ERR_SECS:
+      *pData = sData[/*nDevice*/0].data.nES;
+      break;
+   case DSL_STATS_LINE_0_QUARTER_HOUR_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/0].data.nSES;
+      break;
+   case DSL_STATS_LINE_1_QUARTER_HOUR_ERR_SECS:
+      *pData = sData[/*nDevice*/1].data.nES;
+      break;
+   case DSL_STATS_LINE_1_QUARTER_HOUR_SEV_ERR_SECS:
+      *pData = sData[/*nDevice*/1].data.nSES;
+      break;
+   default:
+      break;
+   }
+
+   return nErrorCode;
+}
+
+static DSL_void_t DSL_CPE_JsonQuarterHourErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nQuarterErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCounters15MinGet(
+         pContext, eNodeIdx, &nQuarterErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nQuarterErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonQuarterHourSevErrSecsUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_int_t nQuarterSevErrSecs = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineSecCounters15MinGet(
+      pContext, eNodeIdx, &nQuarterSevErrSecs) == DSL_SUCCESS)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      pNewObj = json_object_new_int(nQuarterSevErrSecs);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/* --- Channel section ---*/
+
+static DSL_void_t DSL_CPE_JsonChannelDataRatesUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_G997_ChannelStatus_t channelStatus = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   DSL_uint32_t nActualDataRate = 0;
+   const DSL_uint8_t nChannel = 0;
+
+   channelStatus.nChannel = nChannel;
+   channelStatus.nDirection = nDirection;
+
+   nErrCode = DSL_CPE_Ioctl(pContext->fd[nDevice],
+      DSL_FIO_G997_CHANNEL_STATUS_GET, (int)&channelStatus);
+   if (nErrCode == DSL_SUCCESS)
+   {
+      nActualDataRate = channelStatus.data.ActualDataRate;
+   }
+
+   /* update json object */
+   pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+   pNewObj = json_object_new_int(nActualDataRate);
+   json_object_object_add(pParentObj,
+      DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+}
+
+static DSL_void_t DSL_CPE_JsonChannelLinkEncapUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_SUCCESS;
+   DSL_SystemInterfaceStatus_t sysIfData;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   DSL_char_t linkEncapUsed[40];
+   DSL_uint8_t XTSE[DSL_G997_NUM_XTSE_OCTETS] = { 0 };
+   DSL_DslModeSelection_t dslMode = DSL_MODE_NA;
+
+   memset(linkEncapUsed, 0, sizeof(linkEncapUsed));
+   if (DSL_CPE_SystemEnablingStatusGet(
+         pContext, nDevice, XTSE) == DSL_SUCCESS)
+   {
+      if (XTSE[7])
+      {
+         dslMode = DSL_MODE_VDSL;
+      }
+      else
+      {
+         dslMode = DSL_MODE_ADSL;
+      }
+
+      memset(&sysIfData, 0x00, sizeof(DSL_SystemInterfaceStatus_t));
+      nRet = DSL_CPE_Ioctl(
+         pContext->fd[nDevice], DSL_FIO_SYSTEM_INTERFACE_STATUS_GET,
+         (int)&sysIfData);
+      if (nRet == DSL_SUCCESS &&
+            sysIfData.accessCtl.nReturn == DSL_SUCCESS)
+      {
+         switch (sysIfData.data.nTcLayer)
+         {
+         case DSL_TC_ATM:
+            if (dslMode == DSL_MODE_ADSL)
+            {
+               cpe_control_strncpy_s(linkEncapUsed, sizeof(linkEncapUsed),
+                  "G.992.3_Annex_K_ATM", sizeof("G.992.3_Annex_K_ATM"));
+            }
+            else
+            {
+               cpe_control_strncpy_s(linkEncapUsed, sizeof(linkEncapUsed),
+                  "G.993.2_Annex_K_ATM", sizeof("G.993.2_Annex_K_ATM"));
+            }
+            break;
+         case DSL_TC_EFM:
+         case DSL_TC_EFM_FORCED:
+            if (dslMode == DSL_MODE_ADSL)
+            {
+               cpe_control_strncpy_s(linkEncapUsed, sizeof(linkEncapUsed),
+                  "G.992.3_Annex_K_PTM", sizeof("G.992.3_Annex_K_PTM"));
+            }
+            else
+            {
+               cpe_control_strncpy_s(linkEncapUsed, sizeof(linkEncapUsed),
+                  "G.993.2_Annex_K_PTM", sizeof("G.993.2_Annex_K_PTM"));
+            }
+            break;
+         case DSL_TC_AUTO:
+            cpe_control_strncpy_s(linkEncapUsed, sizeof(linkEncapUsed),
+               "G.994.1 (Auto)", sizeof("G.994.1 (Auto)"));
+            break;
+         default:
+            break;
+         }
+
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         pNewObj = json_object_new_string(linkEncapUsed);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET
+   IOCtl from all available devices and DSL modes.
+*/
+static DSL_Error_t DSL_CPE_SystemInterfaceConfigGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_DslModeSelection_t nDslMode,
+   DSL_TcLayerSelection_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_DslModeSelection_t nDsl = DSL_MODE_ADSL;
+   static DSL_SystemInterfaceConfig_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][DSL_MODE_LAST] = { 0 };
+
+   if (pData == DSL_NULL ||
+       nDevice >= DSL_CPE_DSL_ENTITIES ||
+       (nDslMode == DSL_MODE_NA || nDslMode == DSL_MODE_LAST))
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDsl = DSL_MODE_ADSL; nDsl < DSL_MODE_LAST; ++nDsl)
+         {
+            sData[nDev][nDsl].nDslMode = nDsl;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                                DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET,
+                                 (int) &sData[nDev][nDsl]);
+
+            if (nRet < DSL_SUCCESS ||
+                  sData[nDev][nDsl].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET ioctl failed "
+                  "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nRet, sData[nDev][nDsl].accessCtl.nReturn));
+
+               nErrCode = DSL_ERROR;
+            }
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET);
+      }
+   }
+
+   *pData = sData[nDevice][nDslMode].data.nTcLayer;
+
+   return nErrCode;
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_G997_FRAMING_PARAMETER_STATUS_GET
+   IOCtl from all available devices.
+*/
+static DSL_Error_t DSL_CPE_G997FramingParameterStatusGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   DSL_G997_FramingParameterStatusData_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   static DSL_G997_FramingParameterStatus_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES] = { 0 };
+
+   if (pData == DSL_NULL ||
+       nDevice >= DSL_CPE_DSL_ENTITIES)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_G997_FRAMING_PARAMETER_STATUS_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         sData[nDev].nChannel = 0;
+         sData[nDev].nDirection = DSL_DOWNSTREAM;
+
+         nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                              DSL_FIO_G997_FRAMING_PARAMETER_STATUS_GET,
+                              (int) &sData[nDev]);
+
+         if (nRet < DSL_SUCCESS ||
+               sData[nDev].accessCtl.nReturn != DSL_SUCCESS)
+         {
+            DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+               "ERROR - DSL_FIO_G997_FRAMING_PARAMETER_STATUS_GET ioctl failed "
+               "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+               nDev, nRet, sData[nDev].accessCtl.nReturn));
+
+            nErrCode = DSL_ERROR;
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_G997_FRAMING_PARAMETER_STATUS_GET);
+      }
+   }
+
+   /* provide data of corresponding IOCtl request */
+   *pData = sData[nDevice].data;
+
+   return nErrCode;
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_G997_CHANNEL_STATUS_GET
+   IOCtl from all available devices and DSL modes.
+*/
+static DSL_Error_t DSL_CPE_G997ChannelStatusGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nDirection,
+   DSL_G997_ChannelStatusData_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_AccessDir_t nDir = DSL_UPSTREAM;
+   static DSL_G997_ChannelStatus_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][DSL_ACCESSDIR_LAST] = { 0 };
+
+   if (pData == DSL_NULL ||
+       nDevice >= DSL_CPE_DSL_ENTITIES ||
+       (nDirection == DSL_ACCESSDIR_NA || nDirection == DSL_ACCESSDIR_LAST))
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_G997_CHANNEL_STATUS_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_UPSTREAM; nDir < DSL_ACCESSDIR_LAST; ++nDir)
+         {
+            sData[nDev][nDir].nChannel = 0;
+            sData[nDev][nDir].nDirection = nDir;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                                DSL_FIO_G997_CHANNEL_STATUS_GET,
+                                 (int) &sData[nDev][nDir]);
+
+            if (nRet < DSL_SUCCESS ||
+                  sData[nDev][nDir].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               nErrCode = DSL_ERROR;
+
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_G997_CHANNEL_STATUS_GET ioctl failed "
+                  "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nRet, sData[nDev][nDir].accessCtl.nReturn));
+            }
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_G997_CHANNEL_STATUS_GET);
+      }
+   }
+
+   *pData = sData[nDevice][nDirection].data;
+
+   return nErrCode;
+}
+
+static DSL_void_t DSL_CPE_JsonChannelStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_LineStateValue_t data = DSL_LINESTATE_UNKNOWN;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_LineStateGet(pContext, nDevice, &data) ==
+         DSL_SUCCESS)
+   {
+      switch (data)
+      {
+      case DSL_LINESTATE_SHOWTIME_TC_SYNC:
+         pNewObj = json_object_new_string("Up");
+         break;
+      case DSL_LINESTATE_EXCEPTION:
+         pNewObj = json_object_new_string("Error");
+         break;
+      default:
+         pNewObj = json_object_new_string("Down");
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonChannelLinkEncapSupportedUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   DSL_Error_t nRet = DSL_ERROR;
+   DSL_TcLayerSelection_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+   const DSL_uint8_t nBufSupportedSize = 82;
+   char bufSupported[nBufSupportedSize];
+
+   memset(&bufSupported, 0, nBufSupportedSize);
+
+   data = DSL_TC_UNKNOWN;
+   if (DSL_CPE_SystemInterfaceConfigGet(
+         pContext, nDevice, DSL_MODE_ADSL, &data) == DSL_SUCCESS)
+   {
+      switch (data)
+      {
+      case DSL_TC_ATM:
+         nRet = DSL_SUCCESS;
+         cpe_control_strncpy_s(bufSupported, nBufSupportedSize,
+            "G.992.3_Annex_K_ATM,", sizeof("G.992.3_Annex_K_ATM,"));
+         break;
+      case DSL_TC_EFM:
+      case DSL_TC_EFM_FORCED:
+         nRet = DSL_SUCCESS;
+         cpe_control_strncpy_s(bufSupported, nBufSupportedSize,
+            "G.992.3_Annex_K_PTM,", sizeof("G.992.3_Annex_K_PTM,"));
+         break;
+      case DSL_TC_AUTO:
+         nRet = DSL_SUCCESS;
+         cpe_control_strncpy_s(bufSupported, nBufSupportedSize,
+            "G.994.1 (Auto),", sizeof("G.994.1 (Auto),"));
+         break;
+      default:
+         break;
+      }
+   }
+
+   data = DSL_TC_UNKNOWN;
+   if (DSL_CPE_SystemInterfaceConfigGet(
+         pContext, nDevice, DSL_MODE_VDSL, &data) == DSL_SUCCESS)
+   {
+      switch (data)
+      {
+      case DSL_TC_ATM:
+         nRet = DSL_SUCCESS;
+         cpe_control_strncpy_s(bufSupported + strlen(bufSupported),
+            nBufSupportedSize - strlen(bufSupported),
+            "G.992.2_Annex_K_ATM", sizeof("G.992.2_Annex_K_ATM"));
+         break;
+      case DSL_TC_EFM:
+      case DSL_TC_EFM_FORCED:
+         nRet = DSL_SUCCESS;
+         cpe_control_strncpy_s(bufSupported + strlen(bufSupported),
+            nBufSupportedSize - strlen(bufSupported),
+            "G.992.2_Annex_K_PTM", sizeof("G.992.2_Annex_K_PTM"));
+         break;
+      case DSL_TC_AUTO:
+         nRet = DSL_SUCCESS;
+         cpe_control_strncpy_s(bufSupported + strlen(bufSupported),
+            nBufSupportedSize - strlen(bufSupported),
+            "G.994.1 (Auto)", sizeof("G.994.1 (Auto)"));
+         break;
+      default:
+         break;
+      }
+   }
+
+   if (nRet == DSL_SUCCESS)
+   {
+      pNewObj = json_object_new_string(bufSupported);
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonChannelFramingUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_G997_FramingParameterStatusData_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997FramingParameterStatusGet(pContext, nDevice, &data) ==
+         DSL_SUCCESS)
+   {
+      switch (eNodeIdx)
+      {
+      case DSL_STATUS_LINE_0_CHANNEL_LPATH:
+      case DSL_STATUS_LINE_1_CHANNEL_LPATH:
+         pNewObj = json_object_new_int(data.nLPATH);
+         break;
+      case DSL_STATUS_LINE_0_CHANNEL_INTLVDEPTH:
+      case DSL_STATUS_LINE_1_CHANNEL_INTLVDEPTH:
+         pNewObj = json_object_new_int(data.nINTLVDEPTH);
+         break;
+      case DSL_STATUS_LINE_0_CHANNEL_INTLVBLOCK:
+      case DSL_STATUS_LINE_1_CHANNEL_INTLVBLOCK:
+         pNewObj = json_object_new_int(data.nINTLVBLOCK);
+         break;
+      case DSL_STATUS_LINE_0_CHANNEL_NFEC:
+      case DSL_STATUS_LINE_1_CHANNEL_NFEC:
+         pNewObj = json_object_new_int(data.nNFEC);
+         break;
+      case DSL_STATUS_LINE_0_CHANNEL_RFEC:
+      case DSL_STATUS_LINE_1_CHANNEL_RFEC:
+         pNewObj = json_object_new_int(data.nRFEC);
+         break;
+      case DSL_STATUS_LINE_0_CHANNEL_LSYMB:
+      case DSL_STATUS_LINE_1_CHANNEL_LSYMB:
+         pNewObj = json_object_new_int(data.nLSYMB);
+         break;
+      default:
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonChannelActStatusUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_AccessDir_t nAccessDir,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_G997_ChannelStatusData_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_G997ChannelStatusGet(pContext, nDevice, nAccessDir, &data) ==
+         DSL_SUCCESS)
+   {
+      switch (eNodeIdx)
+      {
+      case DSL_STATUS_LINE_0_CHANNEL_ACT_INTERL_DELAY:
+      case DSL_STATUS_LINE_1_CHANNEL_ACT_INTERL_DELAY:
+         pNewObj = json_object_new_int(data.ActualInterleaveDelay);
+         break;
+      case DSL_STATUS_LINE_0_CHANNEL_ACTINP:
+      case DSL_STATUS_LINE_1_CHANNEL_ACTINP:
+         pNewObj = json_object_new_int(data.ActualImpulseNoiseProtection);
+         break;
+      case DSL_STATUS_LINE_0_CHANNEL_ACTNDR_DS:
+      case DSL_STATUS_LINE_1_CHANNEL_ACTNDR_DS:
+      case DSL_STATUS_LINE_0_CHANNEL_ACTNDR_US:
+      case DSL_STATUS_LINE_1_CHANNEL_ACTNDR_US:
+         pNewObj = json_object_new_int(data.ActualNetDataRate);
+         break;
+      case DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN_DS:
+      case DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN_DS:
+      case DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN_US:
+      case DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN_US:
+         pNewObj = json_object_new_int(data.ActualImpulseNoiseProtectionRein);
+         break;
+      default:
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonChannelActINPReportUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_char_t* jsonPath)
+{
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   pNewObj = json_object_new_boolean(DSL_FALSE);
+
+   if (pNewObj != DSL_NULL)
+   {
+      /* update json object */
+      pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+      json_object_object_add(pParentObj,
+         DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_DATA_PATH_COUNTERS_TOTAL_GET
+   IOCtl from all available devices and XTU directions.
+*/
+static DSL_Error_t DSL_CPE_PMChannelDataPathCountersTotalGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nDirection,
+   DSL_uint32_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_XTUDir_t nDir = DSL_NEAR_END;
+   static DSL_PM_DataPathCountersTotal_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][(DSL_FAR_END+1)] = { 0 };
+
+   if (pData == DSL_NULL ||
+       nDevice >= DSL_CPE_DSL_ENTITIES ||
+       nDirection == DSL_XTUDIR_NA)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_DATA_PATH_COUNTERS_TOTAL_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_NEAR_END; nDir <= DSL_FAR_END; ++nDir)
+         {
+            sData[nDev][nDir].nDirection = nDir;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                                 DSL_FIO_PM_DATA_PATH_COUNTERS_TOTAL_GET,
+                                 (int) &sData[nDev][nDir]);
+
+            if (nRet < DSL_SUCCESS ||
+                  sData[nDev][nDir].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_PM_DATA_PATH_COUNTERS_TOTAL_GET ioctl failed "
+                  "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nRet, sData[nDev][nDir].accessCtl.nReturn));
+
+               nErrCode = DSL_ERROR;
+            }
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_DATA_PATH_COUNTERS_TOTAL_GET);
+      }
+   }
+
+   *pData = sData[nDevice][nDirection].data.nHEC;
+
+   return nErrCode;
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_DATA_PATH_COUNTERS_SHOWTIME_GET
+   IOCtl from all available devices, history intervals and XTU directions.
+*/
+static DSL_Error_t DSL_CPE_PMChannelDataPathCountersShowtimeGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nDirection,
+   const DSL_uint32_t nHistoryInterval,
+   DSL_uint32_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_XTUDir_t nDir = DSL_NEAR_END;
+   DSL_uint32_t nHistInt = 0;
+   static DSL_PM_DataPathCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES]
+            [(DSL_FAR_END+1)]
+            [DSL_PM_HISTORY_INTERVALS_NUM] = { 0 };
+
+   if (pData == DSL_NULL ||
+       nDevice >= DSL_CPE_DSL_ENTITIES ||
+       nDirection == DSL_XTUDIR_NA ||
+       nHistoryInterval >= DSL_PM_HISTORY_INTERVALS_NUM)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_DATA_PATH_COUNTERS_SHOWTIME_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_NEAR_END; nDir <= DSL_FAR_END; ++nDir)
+         {
+            for (nHistInt = 0; nHistInt < DSL_PM_HISTORY_INTERVALS_NUM; ++nHistInt)
+            {
+               sData[nDev][nDir][nHistInt].nDirection = nDir;
+               sData[nDev][nDir][nHistInt].nHistoryInterval = nHistInt;
+
+               nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                                    DSL_FIO_PM_DATA_PATH_COUNTERS_SHOWTIME_GET,
+                                    (int) &sData[nDev][nDir][nHistInt]);
+
+               if (nRet < DSL_SUCCESS ||
+                     sData[nDev][nDir][nHistInt].accessCtl.nReturn != DSL_SUCCESS)
+               {
+                  DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                     "ERROR - DSL_FIO_PM_DATA_PATH_COUNTERS_SHOWTIME_GET "
+                     "ioctl failed (device<%d>, direction<%s>, "
+                     "historyInterval<%d>, nRet=%d, "
+                     "accessCtrl=%d)!" DSL_CPE_CRLF,
+                     nDev, (nDir == DSL_NEAR_END) ? "near end" : "far end",
+                     nHistInt, nRet,
+                     sData[nDev][nDir][nHistInt].accessCtl.nReturn));
+               }
+            }
+         }
+      }
+
+      /* no check for IOCTL failure here - it may happen that IOCTL failes
+         due to request for nHistoryInterval that was not yet reached */
+      DSL_CPE_IoctlFlagSet(DSL_FIO_PM_DATA_PATH_COUNTERS_SHOWTIME_GET);
+   }
+
+   *pData = sData[nDevice][nDirection][nHistoryInterval].data.nHEC;
+
+   return nErrCode;
+}
+
+static DSL_void_t DSL_CPE_JsonChannelCountersTotalUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_PM_ChannelCountersTotal_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMCountersTotalGet(
+         pContext, nDevice, nXTUDir, &data) == DSL_SUCCESS)
+   {
+      switch (eNodeIdx)
+      {
+      case DSL_STATS_LINE_0_CHANNEL_TOTAL_START:
+      case DSL_STATS_LINE_1_CHANNEL_TOTAL_START:
+         pNewObj = json_object_new_int(data.total.nElapsedTime);
+         break;
+      case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_FEC_ERRORS:
+         pNewObj = json_object_new_int(data.data.nFEC);
+         break;
+      case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_CRC_ERRORS:
+         pNewObj = json_object_new_int(data.data.nCodeViolations);
+         break;
+      default:
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonChannelDataPathCountersTotalUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t data = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMChannelDataPathCountersTotalGet(
+         pContext, nDevice, nXTUDir, &data) == DSL_SUCCESS)
+   {
+      pNewObj = json_object_new_int(data);
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonChannelCountersShowtimeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_uint32_t nHistoryInterval,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_PM_ChannelCounters_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMCountersShowtimeGet(
+         pContext, nDevice, nXTUDir, nHistoryInterval, &data) ==
+         DSL_SUCCESS)
+   {
+      switch (eNodeIdx)
+      {
+      case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_START:
+      case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_START:
+      case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_START:
+      case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_START:
+         pNewObj = json_object_new_int(data.interval.nElapsedTime);
+         break;
+      case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_FEC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_FEC_ERRORS:
+         pNewObj = json_object_new_int(data.data.nFEC);
+         break;
+      case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_CRC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_CRC_ERRORS:
+         pNewObj = json_object_new_int(data.data.nCodeViolations);
+         break;
+      default:
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonChannelDataPathCountersShowtimeUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_uint32_t nHistoryInterval,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t data = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMChannelDataPathCountersShowtimeGet(
+         pContext, nDevice, nXTUDir, nHistoryInterval, &data) ==
+         DSL_SUCCESS)
+   {
+      pNewObj = json_object_new_int(data);
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_CHANNEL_COUNTERS_1DAY_GET
+   IOCtl from all available devices and XTU directions.
+*/
+static DSL_Error_t DSL_CPE_PMChannelCounters1DayGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nDirection,
+   DSL_PM_ChannelCounters_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_XTUDir_t nDir = DSL_NEAR_END;
+   static DSL_PM_ChannelCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][(DSL_FAR_END+1)] = { 0 };
+
+   if (pData == DSL_NULL ||
+       nDevice >= DSL_CPE_DSL_ENTITIES ||
+       nDirection == DSL_XTUDIR_NA)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_CHANNEL_COUNTERS_1DAY_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_NEAR_END; nDir <= DSL_FAR_END; ++nDir)
+         {
+            sData[nDev][nDir].nHistoryInterval = 0;
+            sData[nDev][nDir].nDirection = nDir;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                                 DSL_FIO_PM_CHANNEL_COUNTERS_1DAY_GET,
+                                 (int) &sData[nDev][nDir]);
+
+            if (nRet < DSL_SUCCESS ||
+                  sData[nDev][nDir].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_PM_CHANNEL_COUNTERS_1DAY_GET ioctl failed "
+                  "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nRet, sData[nDev][nDir].accessCtl.nReturn));
+
+               nErrCode = DSL_ERROR;
+            }
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_CHANNEL_COUNTERS_1DAY_GET);
+      }
+   }
+
+   *pData = sData[nDevice][nDirection];
+
+   return nErrCode;
+}
+
+static DSL_void_t DSL_CPE_JsonChannelCounters1DayUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_PM_ChannelCounters_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMChannelCounters1DayGet(
+         pContext, nDevice, nXTUDir, &data) == DSL_SUCCESS)
+   {
+      switch (eNodeIdx)
+      {
+      case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_START:
+      case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_START:
+         pNewObj = json_object_new_int(data.interval.nElapsedTime);
+         break;
+      case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_FEC_ERRORS:
+         pNewObj = json_object_new_int(data.data.nFEC);
+         break;
+      case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_CRC_ERRORS:
+         pNewObj = json_object_new_int(data.data.nCodeViolations);
+         break;
+      default:
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_DATA_PATH_COUNTERS_1DAY_GET
+   IOCtl from all available devices and XTU directions.
+*/
+static DSL_Error_t DSL_CPE_PMChannelDataPathCounters1DayGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nDirection,
+   DSL_uint32_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_XTUDir_t nDir = DSL_NEAR_END;
+   static DSL_PM_DataPathCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][(DSL_FAR_END+1)] = { 0 };
+
+   if (pData == DSL_NULL ||
+       nDevice >= DSL_CPE_DSL_ENTITIES ||
+       nDirection == DSL_XTUDIR_NA)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_DATA_PATH_COUNTERS_1DAY_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_NEAR_END; nDir <= DSL_FAR_END; ++nDir)
+         {
+            sData[nDev][nDir].nHistoryInterval = 0;
+            sData[nDev][nDir].nDirection = nDir;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                                 DSL_FIO_PM_DATA_PATH_COUNTERS_1DAY_GET,
+                                 (int) &sData[nDev][nDir]);
+
+            if (nRet < DSL_SUCCESS ||
+                  sData[nDev][nDir].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_PM_DATA_PATH_COUNTERS_1DAY_GET ioctl failed "
+                  "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nRet, sData[nDev][nDir].accessCtl.nReturn));
+
+               nErrCode = DSL_ERROR;
+            }
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_DATA_PATH_COUNTERS_1DAY_GET);
+      }
+   }
+
+   *pData = sData[nDevice][nDirection].data.nHEC;
+
+   return nErrCode;
+}
+
+static DSL_void_t DSL_CPE_JsonChannelDataPathCounters1DayUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t data = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMChannelDataPathCounters1DayGet(
+         pContext, nDevice, nXTUDir, &data) == DSL_SUCCESS)
+   {
+      pNewObj = json_object_new_int(data);
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+static DSL_void_t DSL_CPE_JsonChannelCounters15MinUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx,
+   const DSL_char_t* jsonPath)
+{
+   DSL_PM_ChannelCounters_t data = { 0 };
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMCounters15MinGet(
+         pContext, nDevice, nXTUDir, &data) == DSL_SUCCESS)
+   {
+      switch (eNodeIdx)
+      {
+      case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_START:
+      case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_START:
+         pNewObj = json_object_new_int(data.interval.nElapsedTime);
+         break;
+      case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_FEC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_FEC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_FEC_ERRORS:
+         pNewObj = json_object_new_int(data.data.nFEC);
+         break;
+      case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_CRC_ERRORS:
+      case DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_CRC_ERRORS:
+      case DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_CRC_ERRORS:
+         pNewObj = json_object_new_int(data.data.nCodeViolations);
+         break;
+      default:
+         break;
+      }
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+/*
+   This function collects all data provided by
+   DSL_FIO_PM_DATA_PATH_COUNTERS_15MIN_GET
+   IOCtl from all available devices and XTU directions.
+*/
+static DSL_Error_t DSL_CPE_PMChannelDataPathCounters15MinGet(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nDirection,
+   DSL_uint32_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_uint32_t nDev = 0;
+   DSL_XTUDir_t nDir = DSL_NEAR_END;
+   static DSL_PM_DataPathCounters_t
+      sData[DSL_CPE_MAX_DSL_ENTITIES][(DSL_FAR_END+1)] = { 0 };
+
+   if (pData == DSL_NULL ||
+       nDevice >= DSL_CPE_DSL_ENTITIES ||
+       nDirection == DSL_XTUDIR_NA)
+   {
+      return DSL_ERROR;
+   }
+
+   if (!DSL_CPE_IsIoctlFlagSet(DSL_FIO_PM_DATA_PATH_COUNTERS_15MIN_GET))
+   {
+      for (nDev = 0; nDev < DSL_CPE_DSL_ENTITIES; ++nDev)
+      {
+         for (nDir = DSL_NEAR_END; nDir <= DSL_FAR_END; ++nDir)
+         {
+            sData[nDev][nDir].nHistoryInterval = 0;
+            sData[nDev][nDir].nDirection = nDir;
+
+            nRet = DSL_CPE_Ioctl(pContext->fd[nDev],
+                                 DSL_FIO_PM_DATA_PATH_COUNTERS_15MIN_GET,
+                                 (int) &sData[nDev][nDir]);
+
+            if (nRet < DSL_SUCCESS ||
+                  sData[nDev][nDir].accessCtl.nReturn != DSL_SUCCESS)
+            {
+               DSL_CCA_DEBUG(DSL_CCA_DBG_ERR, (DSL_CPE_PREFIX
+                  "ERROR - DSL_FIO_PM_DATA_PATH_COUNTERS_15MIN_GET ioctl failed "
+                  "(device<%d>, nRet=%d, accessCtrl=%d)!" DSL_CPE_CRLF,
+                  nDev, nRet, sData[nDev][nDir].accessCtl.nReturn));
+
+               nErrCode = DSL_ERROR;
+            }
+         }
+      }
+
+      /* set ioctl flag only if all IOCTLs succeeded */
+      if (nErrCode == DSL_SUCCESS)
+      {
+         DSL_CPE_IoctlFlagSet(DSL_FIO_PM_DATA_PATH_COUNTERS_15MIN_GET);
+      }
+   }
+
+   *pData = sData[nDevice][nDirection].data.nHEC;
+
+   return nErrCode;
+}
+
+static DSL_void_t DSL_CPE_JsonChannelDataPathCounters15MinUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_int_t nDevice,
+   const DSL_XTUDir_t nXTUDir,
+   const DSL_char_t* jsonPath)
+{
+   DSL_uint32_t data = 0;
+   json_object *pParentObj = DSL_NULL, *pNewObj = DSL_NULL;
+
+   if (DSL_CPE_PMChannelDataPathCounters15MinGet(
+         pContext, nDevice, nXTUDir, &data) == DSL_SUCCESS)
+   {
+      pNewObj = json_object_new_int(data);
+
+      if (pNewObj != DSL_NULL)
+      {
+         /* update json object */
+         pParentObj = DSL_CPE_JsonNodeParentGet(pJsonStatusRootObj, jsonPath);
+         json_object_object_add(pParentObj,
+            DSL_CPE_JsonNodeNameGet(jsonPath), pNewObj);
+      }
+   }
+}
+
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
diff --git a/src/dsl_cpe_status_parser.h b/src/dsl_cpe_status_parser.h
new file mode 100644
index 0000000000000000000000000000000000000000..d26510d466caf53e027361f95ec38bd43c6bffe2
--- /dev/null
+++ b/src/dsl_cpe_status_parser.h
@@ -0,0 +1,374 @@
+/******************************************************************************
+
+         Copyright (c) 2019 Intel Corporation
+
+  For licensing information, see the file 'LICENSE' in the root folder of
+  this software module.
+
+*******************************************************************************/
+
+#ifndef _DSL_CPE_STATUS_PARSER_H
+#define _DSL_CPE_STATUS_PARSER_H
+
+#if defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1)
+#include "dsl_cpe_control.h"
+
+/**
+   Definitions for all specified JSON Status File nodes
+   (these definitions will be used for different type
+   parameters' updates)
+*/
+typedef enum
+{
+   DSL_ROOT = 0,
+   /* common section */
+   DSL_LINE_ENTRIES,/*1*/
+   DSL_CHANNEL_ENTRIES,/*2*/
+   DSL_BND_GROUP_ENTRIES,/*3*/
+   DSL_API_VERSION,/*4*/
+   DSL_MEI_VERSION,/*5*/
+   DSL_HW_VERSION,/*6*/
+   DSL_CHIPSET_TYPE,/*7*/
+   /* <dsl.status> section */
+   DSL_STATUS,/*8*/
+   DSL_STATUS_LINE,/*9*/
+      /* <dsl.status.line.0> section */
+      DSL_STATUS_LINE_0,/*10*/
+      DSL_STATUS_LINE_0_STATUS,/*11*/
+      DSL_STATUS_LINE_0_UPSTREAM,/*12*/
+      DSL_STATUS_LINE_0_FW_VERSION,/*13*/
+      DSL_STATUS_LINE_0_LINK_STATUS,/*14*/
+      DSL_STATUS_LINE_0_STD_SUPPORTED,/*15*/
+      DSL_STATUS_LINE_0_XTSE,/*16*/
+      DSL_STATUS_LINE_0_STD_USED,/*17*/
+      DSL_STATUS_LINE_0_XTSE_USED,/*18*/
+      DSL_STATUS_LINE_0_ENCODING,/*19*/
+      DSL_STATUS_LINE_0_ALLOWED_PROFILES,/*20*/
+      DSL_STATUS_LINE_0_CURRENT_PROFILE,/*21*/
+      DSL_STATUS_LINE_0_PWR_MGMT_STATE,/*22*/
+      DSL_STATUS_LINE_0_SUCC_FAIL_CAUSE,/*23*/
+      DSL_STATUS_LINE_0_LAST_STATE_TRANSM,/*24*/
+      DSL_STATUS_LINE_0_LAST_STATE_TRANSM_US,/*25*/
+      DSL_STATUS_LINE_0_LAST_STATE_TRANSM_DS,/*26*/
+      DSL_STATUS_LINE_0_US0_MASK,/*27*/
+      DSL_STATUS_LINE_0_TRELLIS,/*28*/
+      DSL_STATUS_LINE_0_TRELLIS_US,/*29*/
+      DSL_STATUS_LINE_0_TRELLIS_DS,/*30*/
+      DSL_STATUS_LINE_0_ACT_SNR_MODE,/*31*/
+      DSL_STATUS_LINE_0_ACT_SNR_MODE_US,/*32*/
+      DSL_STATUS_LINE_0_ACT_SNR_MODE_DS,/*33*/
+      DSL_STATUS_LINE_0_LINE_NR,/*34*/
+      DSL_STATUS_LINE_0_MAX_BIT_RATE,/*35*/
+      DSL_STATUS_LINE_0_MAX_BIT_RATE_US,/*36*/
+      DSL_STATUS_LINE_0_MAX_BIT_RATE_DS,/*37*/
+      DSL_STATUS_LINE_0_NOISE_MARGIN,/*38*/
+      DSL_STATUS_LINE_0_NOISE_MARGIN_US,/*39*/
+      DSL_STATUS_LINE_0_NOISE_MARGIN_DS,/*40*/
+      DSL_STATUS_LINE_0_SNR_MPB,/*41*/
+      DSL_STATUS_LINE_0_SNR_MPB_US,/*42*/
+      DSL_STATUS_LINE_0_SNR_MPB_DS,/*43*/
+      DSL_STATUS_LINE_0_POWER,/*44*/
+      DSL_STATUS_LINE_0_POWER_US,/*45*/
+      DSL_STATUS_LINE_0_POWER_DS,/*46*/
+      DSL_STATUS_LINE_0_XTUR_VENDOR,/*47*/
+      DSL_STATUS_LINE_0_XTUR_COUNTRY,/*48*/
+      DSL_STATUS_LINE_0_XTUR_ANSI_STD,/*49*/
+      DSL_STATUS_LINE_0_XTUR_ANSI_REV,/*50*/
+      DSL_STATUS_LINE_0_XTUC_VENDOR,/*51*/
+      DSL_STATUS_LINE_0_XTUC_COUNTRY,/*52*/
+      DSL_STATUS_LINE_0_XTUC_ANSI_STD,/*53*/
+      DSL_STATUS_LINE_0_XTUC_ANSI_REV,/*54*/
+      DSL_STATUS_LINE_0_UPBOKLER_PB,/*55*/
+      DSL_STATUS_LINE_0_RXTHRSH_DS,/*56*/
+      DSL_STATUS_LINE_0_ACT_RA_MODE,/*57*/
+      DSL_STATUS_LINE_0_ACT_RA_MODE_US,/*58*/
+      DSL_STATUS_LINE_0_ACT_RA_MODE_DS,/*59*/
+      DSL_STATUS_LINE_0_SNR_MROC,/*60*/
+      DSL_STATUS_LINE_0_SNR_MROC_US,/*61*/
+      DSL_STATUS_LINE_0_SNR_MROC_DS,/*62*/
+      DSL_STATUS_LINE_0_ATTENUATION,/*63*/
+      DSL_STATUS_LINE_0_ATTENUATION_US,/*64*/
+      DSL_STATUS_LINE_0_ATTENUATION_DS,/*65*/
+         /* <dsl.status.line.0.channel> section */
+         DSL_STATUS_LINE_0_CHANNEL,/*66*/
+         DSL_STATUS_LINE_0_CHANNEL_STATUS,/*67*/
+         DSL_STATUS_LINE_0_CHANNEL_LINKENC_SUPP,/*68*/
+         DSL_STATUS_LINE_0_CHANNEL_LINKENC_USED,/*69*/
+         DSL_STATUS_LINE_0_CHANNEL_LPATH,/*70*/
+         DSL_STATUS_LINE_0_CHANNEL_INTLVDEPTH,/*71*/
+         DSL_STATUS_LINE_0_CHANNEL_INTLVBLOCK,/*72*/
+         DSL_STATUS_LINE_0_CHANNEL_ACT_INTERL_DELAY,/*73*/
+         DSL_STATUS_LINE_0_CHANNEL_ACTINP,/*74*/
+         DSL_STATUS_LINE_0_CHANNEL_INPREPORT,/*75*/
+         DSL_STATUS_LINE_0_CHANNEL_NFEC,/*76*/
+         DSL_STATUS_LINE_0_CHANNEL_RFEC,/*77*/
+         DSL_STATUS_LINE_0_CHANNEL_LSYMB,/*78*/
+         DSL_STATUS_LINE_0_CHANNEL_DATARATE,/*79*/
+         DSL_STATUS_LINE_0_CHANNEL_DATARATE_US,/*80*/
+         DSL_STATUS_LINE_0_CHANNEL_DATARATE_DS,/*81*/
+         DSL_STATUS_LINE_0_CHANNEL_ACTNDR,/*82*/
+         DSL_STATUS_LINE_0_CHANNEL_ACTNDR_US,/*83*/
+         DSL_STATUS_LINE_0_CHANNEL_ACTNDR_DS,/*84*/
+         DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN,/*85*/
+         DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN_US,/*86*/
+         DSL_STATUS_LINE_0_CHANNEL_ACTINPREIN_DS,/*87*/
+      /* <dsl.status.line.1> section */
+      DSL_STATUS_LINE_1,/*88*/
+      DSL_STATUS_LINE_1_STATUS,/*89*/
+      DSL_STATUS_LINE_1_UPSTREAM,/*90*/
+      DSL_STATUS_LINE_1_FW_VERSION,/*91*/
+      DSL_STATUS_LINE_1_LINK_STATUS,/*92*/
+      DSL_STATUS_LINE_1_STD_SUPPORTED,/*93*/
+      DSL_STATUS_LINE_1_XTSE,/*94*/
+      DSL_STATUS_LINE_1_STD_USED,/*95*/
+      DSL_STATUS_LINE_1_XTSE_USED,/*96*/
+      DSL_STATUS_LINE_1_ENCODING,/*97*/
+      DSL_STATUS_LINE_1_ALLOWED_PROFILES,/*98*/
+      DSL_STATUS_LINE_1_CURRENT_PROFILE,/*99*/
+      DSL_STATUS_LINE_1_PWR_MGMT_STATE,/*100*/
+      DSL_STATUS_LINE_1_SUCC_FAIL_CAUSE,/*101*/
+      DSL_STATUS_LINE_1_LAST_STATE_TRANSM,/*102*/
+      DSL_STATUS_LINE_1_LAST_STATE_TRANSM_US,/*103*/
+      DSL_STATUS_LINE_1_LAST_STATE_TRANSM_DS,/*104*/
+      DSL_STATUS_LINE_1_US0_MASK,/*105*/
+      DSL_STATUS_LINE_1_TRELLIS,/*106*/
+      DSL_STATUS_LINE_1_TRELLIS_US,/*107*/
+      DSL_STATUS_LINE_1_TRELLIS_DS,/*108*/
+      DSL_STATUS_LINE_1_ACT_SNR_MODE,/*109*/
+      DSL_STATUS_LINE_1_ACT_SNR_MODE_US,/*110*/
+      DSL_STATUS_LINE_1_ACT_SNR_MODE_DS,/*111*/
+      DSL_STATUS_LINE_1_LINE_NR,/*112*/
+      DSL_STATUS_LINE_1_MAX_BIT_RATE,/*113*/
+      DSL_STATUS_LINE_1_MAX_BIT_RATE_US,/*114*/
+      DSL_STATUS_LINE_1_MAX_BIT_RATE_DS,/*115*/
+      DSL_STATUS_LINE_1_NOISE_MARGIN,/*116*/
+      DSL_STATUS_LINE_1_NOISE_MARGIN_US,/*117*/
+      DSL_STATUS_LINE_1_NOISE_MARGIN_DS,/*118*/
+      DSL_STATUS_LINE_1_SNR_MPB,/*119*/
+      DSL_STATUS_LINE_1_SNR_MPB_US,/*120*/
+      DSL_STATUS_LINE_1_SNR_MPB_DS,/*121*/
+      DSL_STATUS_LINE_1_POWER,/*122*/
+      DSL_STATUS_LINE_1_POWER_US,/*123*/
+      DSL_STATUS_LINE_1_POWER_DS,/*124*/
+      DSL_STATUS_LINE_1_XTUR_VENDOR,/*125*/
+      DSL_STATUS_LINE_1_XTUR_COUNTRY,/*126*/
+      DSL_STATUS_LINE_1_XTUR_ANSI_STD,/*127*/
+      DSL_STATUS_LINE_1_XTUR_ANSI_REV,/*128*/
+      DSL_STATUS_LINE_1_XTUC_VENDOR,/*129*/
+      DSL_STATUS_LINE_1_XTUC_COUNTRY,/*130*/
+      DSL_STATUS_LINE_1_XTUC_ANSI_STD,/*131*/
+      DSL_STATUS_LINE_1_XTUC_ANSI_REV,/*132*/
+      DSL_STATUS_LINE_1_UPBOKLER_PB,/*133*/
+      DSL_STATUS_LINE_1_RXTHRSH_DS,/*134*/
+      DSL_STATUS_LINE_1_ACT_RA_MODE,/*135*/
+      DSL_STATUS_LINE_1_ACT_RA_MODE_US,/*136*/
+      DSL_STATUS_LINE_1_ACT_RA_MODE_DS,/*137*/
+      DSL_STATUS_LINE_1_SNR_MROC,/*138*/
+      DSL_STATUS_LINE_1_SNR_MROC_US,/*139*/
+      DSL_STATUS_LINE_1_SNR_MROC_DS,/*140*/
+      DSL_STATUS_LINE_1_ATTENUATION,/*141*/
+      DSL_STATUS_LINE_1_ATTENUATION_US,/*142*/
+      DSL_STATUS_LINE_1_ATTENUATION_DS,/*143*/
+         /* <dsl.status.line.1.channel> section */
+         DSL_STATUS_LINE_1_CHANNEL,/*144*/
+         DSL_STATUS_LINE_1_CHANNEL_STATUS,/*145*/
+         DSL_STATUS_LINE_1_CHANNEL_LINKENC_SUPP,/*146*/
+         DSL_STATUS_LINE_1_CHANNEL_LINKENC_USED,/*147*/
+         DSL_STATUS_LINE_1_CHANNEL_LPATH,/*148*/
+         DSL_STATUS_LINE_1_CHANNEL_INTLVDEPTH,/*149*/
+         DSL_STATUS_LINE_1_CHANNEL_INTLVBLOCK,/*150*/
+         DSL_STATUS_LINE_1_CHANNEL_ACT_INTERL_DELAY,/*151*/
+         DSL_STATUS_LINE_1_CHANNEL_ACTINP,/*152*/
+         DSL_STATUS_LINE_1_CHANNEL_INPREPORT,/*153*/
+         DSL_STATUS_LINE_1_CHANNEL_NFEC,/*154*/
+         DSL_STATUS_LINE_1_CHANNEL_RFEC,/*155*/
+         DSL_STATUS_LINE_1_CHANNEL_LSYMB,/*156*/
+         DSL_STATUS_LINE_1_CHANNEL_DATARATE,/*157*/
+         DSL_STATUS_LINE_1_CHANNEL_DATARATE_US,/*158*/
+         DSL_STATUS_LINE_1_CHANNEL_DATARATE_DS,/*159*/
+         DSL_STATUS_LINE_1_CHANNEL_ACTNDR,/*160*/
+         DSL_STATUS_LINE_1_CHANNEL_ACTNDR_US,/*161*/
+         DSL_STATUS_LINE_1_CHANNEL_ACTNDR_DS,/*162*/
+         DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN,/*163*/
+         DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN_US,/*164*/
+         DSL_STATUS_LINE_1_CHANNEL_ACTINPREIN_DS,/*165*/
+   /* <dsl.stats> section */
+   DSL_STATS,/*166*/
+   DSL_STATS_LINE,/*167*/
+      /* <dsl.stats.line.0> section */
+      DSL_STATS_LINE_0,/*168*/
+      DSL_STATS_LINE_0_TOTAL_START,/*169*/
+      DSL_STATS_LINE_0_SHOWTIME_START,/*170*/
+      DSL_STATS_LINE_0_LAST_SHOWTIME_START,/*171*/
+      DSL_STATS_LINE_0_CURRENT_DAY_START,/*172*/
+      DSL_STATS_LINE_0_QUARTER_HOUR_START,/*173*/
+      DSL_STATS_LINE_0_TOTAL,/*174*/
+      DSL_STATS_LINE_0_TOTAL_ERR_SECS,/*175*/
+      DSL_STATS_LINE_0_TOTAL_SEV_ERR_SECS,/*176*/
+      DSL_STATS_LINE_0_SHOWTIME,/*177*/
+      DSL_STATS_LINE_0_SHOWTIME_ERR_SECS,/*178*/
+      DSL_STATS_LINE_0_SHOWTIME_SEV_ERR_SECS,/*179*/
+      DSL_STATS_LINE_0_LAST_SHOWTIME,/*180*/
+      DSL_STATS_LINE_0_LAST_SHOWTIME_ERR_SECS,/*181*/
+      DSL_STATS_LINE_0_LAST_SHOWTIME_SEV_ERR_SECS,/*182*/
+      DSL_STATS_LINE_0_CURRENT_DAY,/*183*/
+      DSL_STATS_LINE_0_CURRENT_DAY_ERR_SECS,/*184*/
+      DSL_STATS_LINE_0_CURRENT_DAY_SEV_ERR_SECS,/*185*/
+      DSL_STATS_LINE_0_QUARTER_HOUR,/*186*/
+      DSL_STATS_LINE_0_QUARTER_HOUR_ERR_SECS,/*187*/
+      DSL_STATS_LINE_0_QUARTER_HOUR_SEV_ERR_SECS,/*188*/
+         /* <dsl.stats.line.0.channel> section */
+         DSL_STATS_LINE_0_CHANNEL,/*189*/
+         DSL_STATS_LINE_0_CHANNEL_TOTAL_START,/*190*/
+         DSL_STATS_LINE_0_CHANNEL_SHOWTIME_START,/*191*/
+         DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_START,/*192*/
+         DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_START,/*193*/
+         DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_START,/*194*/
+         DSL_STATS_LINE_0_CHANNEL_TOTAL,/*195*/
+         DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_FEC_ERRORS,/*196*/
+         DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_CRC_ERRORS,/*197*/
+         DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_FEC_ERRORS,/*198*/
+         DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_CRC_ERRORS,/*199*/
+         DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUR_HEC_ERRORS,/*200*/
+         DSL_STATS_LINE_0_CHANNEL_TOTAL_XTUC_HEC_ERRORS,/*201*/
+         DSL_STATS_LINE_0_CHANNEL_SHOWTIME,/*202*/
+         DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_FEC_ERRORS,/*203*/
+         DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_CRC_ERRORS,/*204*/
+         DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_FEC_ERRORS,/*205*/
+         DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_CRC_ERRORS,/*206*/
+         DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUR_HEC_ERRORS,/*207*/
+         DSL_STATS_LINE_0_CHANNEL_SHOWTIME_XTUC_HEC_ERRORS,/*208*/
+         DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME,/*209*/
+         DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_FEC_ERRORS,/*210*/
+         DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_CRC_ERRORS,/*211*/
+         DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_FEC_ERRORS,/*212*/
+         DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_CRC_ERRORS,/*213*/
+         DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUR_HEC_ERRORS,/*214*/
+         DSL_STATS_LINE_0_CHANNEL_LAST_SHOWTIME_XTUC_HEC_ERRORS,/*215*/
+         DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY,/*216*/
+         DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_FEC_ERRORS,/*217*/
+         DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_CRC_ERRORS,/*218*/
+         DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_FEC_ERRORS,/*219*/
+         DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_CRC_ERRORS,/*220*/
+         DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUR_HEC_ERRORS,/*221*/
+         DSL_STATS_LINE_0_CHANNEL_CURRENT_DAY_XTUC_HEC_ERRORS,/*222*/
+         DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR,/*223*/
+         DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_FEC_ERRORS,/*224*/
+         DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_CRC_ERRORS,/*225*/
+         DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_FEC_ERRORS,/*226*/
+         DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_CRC_ERRORS,/*227*/
+         DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUR_HEC_ERRORS,/*228*/
+         DSL_STATS_LINE_0_CHANNEL_QUARTER_HOUR_XTUC_HEC_ERRORS,/*229*/
+      /* <dsl.stats.line.1> section */
+      DSL_STATS_LINE_1,/*230*/
+      DSL_STATS_LINE_1_TOTAL_START,/*231*/
+      DSL_STATS_LINE_1_SHOWTIME_START,/*232*/
+      DSL_STATS_LINE_1_LAST_SHOWTIME_START,/*233*/
+      DSL_STATS_LINE_1_CURRENT_DAY_START,/*234*/
+      DSL_STATS_LINE_1_QUARTER_HOUR_START,/*235*/
+      DSL_STATS_LINE_1_TOTAL,/*236*/
+      DSL_STATS_LINE_1_TOTAL_ERR_SECS,/*237*/
+      DSL_STATS_LINE_1_TOTAL_SEV_ERR_SECS,/*238*/
+      DSL_STATS_LINE_1_SHOWTIME,/*239*/
+      DSL_STATS_LINE_1_SHOWTIME_ERR_SECS,/*240*/
+      DSL_STATS_LINE_1_SHOWTIME_SEV_ERR_SECS,/*241*/
+      DSL_STATS_LINE_1_LAST_SHOWTIME,/*242*/
+      DSL_STATS_LINE_1_LAST_SHOWTIME_ERR_SECS,/*243*/
+      DSL_STATS_LINE_1_LAST_SHOWTIME_SEV_ERR_SECS,/*244*/
+      DSL_STATS_LINE_1_CURRENT_DAY,/*245*/
+      DSL_STATS_LINE_1_CURRENT_DAY_ERR_SECS,/*246*/
+      DSL_STATS_LINE_1_CURRENT_DAY_SEV_ERR_SECS,/*247*/
+      DSL_STATS_LINE_1_QUARTER_HOUR,/*248*/
+      DSL_STATS_LINE_1_QUARTER_HOUR_ERR_SECS,/*249*/
+      DSL_STATS_LINE_1_QUARTER_HOUR_SEV_ERR_SECS,/*250*/
+         /* <dsl.stats.line.1.channel> section */
+         DSL_STATS_LINE_1_CHANNEL,/*251*/
+         DSL_STATS_LINE_1_CHANNEL_TOTAL_START,/*252*/
+         DSL_STATS_LINE_1_CHANNEL_SHOWTIME_START,/*253*/
+         DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_START,/*254*/
+         DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_START,/*255*/
+         DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_START,/*256*/
+         DSL_STATS_LINE_1_CHANNEL_TOTAL,/*257*/
+         DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_FEC_ERRORS,/*258*/
+         DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_CRC_ERRORS,/*259*/
+         DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_FEC_ERRORS,/*260*/
+         DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_CRC_ERRORS,/*261*/
+         DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUR_HEC_ERRORS,/*262*/
+         DSL_STATS_LINE_1_CHANNEL_TOTAL_XTUC_HEC_ERRORS,/*263*/
+         DSL_STATS_LINE_1_CHANNEL_SHOWTIME,/*264*/
+         DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_FEC_ERRORS,/*265*/
+         DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_CRC_ERRORS,/*266*/
+         DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_FEC_ERRORS,/*267*/
+         DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_CRC_ERRORS,/*268*/
+         DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUR_HEC_ERRORS,/*269*/
+         DSL_STATS_LINE_1_CHANNEL_SHOWTIME_XTUC_HEC_ERRORS,/*270*/
+         DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME,/*271*/
+         DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_FEC_ERRORS,/*272*/
+         DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_CRC_ERRORS,/*273*/
+         DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_FEC_ERRORS,/*274*/
+         DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_CRC_ERRORS,/*275*/
+         DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUR_HEC_ERRORS,/*276*/
+         DSL_STATS_LINE_1_CHANNEL_LAST_SHOWTIME_XTUC_HEC_ERRORS,/*277*/
+         DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY,/*278*/
+         DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_FEC_ERRORS,/*279*/
+         DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_CRC_ERRORS,/*280*/
+         DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_FEC_ERRORS,/*281*/
+         DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_CRC_ERRORS,/*282*/
+         DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUR_HEC_ERRORS,/*283*/
+         DSL_STATS_LINE_1_CHANNEL_CURRENT_DAY_XTUC_HEC_ERRORS,/*284*/
+         DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR,/*285*/
+         DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_FEC_ERRORS,/*286*/
+         DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_CRC_ERRORS,/*287*/
+         DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_FEC_ERRORS,/*288*/
+         DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_CRC_ERRORS,/*289*/
+         DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUR_HEC_ERRORS,/*290*/
+         DSL_STATS_LINE_1_CHANNEL_QUARTER_HOUR_XTUC_HEC_ERRORS/*291*/
+} DSL_CPE_StatusNodeIdx_t;
+
+/**
+   This function creates the initial Status File
+   and updates the init parameters values
+
+   \param pContext   - Pointer to dsl cpe library context structure, [I]
+
+   \return
+   Return values are defined within the DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+DSL_Error_t DSL_CPE_StatusFileInitialize(
+   DSL_CPE_Control_Context_t *pContext);
+
+/**
+   This function updates Status File parameters
+   triggered by events
+
+   \param pContext   - Pointer to dsl cpe library context structure, [I]
+
+   \return
+   Return values are defined within the DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+DSL_Error_t DSL_CPE_StatusFileEvtUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t eNodeIdx);
+
+/**
+   This function updates Status File parameters
+   triggered by the polling timer
+
+   \param pContext   - Pointer to dsl cpe library context structure, [I]
+
+   \return
+   Return values are defined within the DSL_Error_t definition
+   - DSL_SUCCESS in case of success
+   - DSL_ERROR if operation failed
+*/
+DSL_Error_t DSL_CPE_StatusFilePollUpdate(
+   DSL_CPE_Control_Context_t *pContext,
+   const DSL_CPE_StatusNodeIdx_t ePollSectionIdx);
+
+#endif /* defined(INCLUDE_DSL_JSON_PARSING) && (INCLUDE_DSL_JSON_PARSING == 1) */
+
+#endif /* _LIB_DSL_STATUS_PARSER_H */
diff --git a/tools/pipe/Makefile.am b/tools/pipe/Makefile.am
index f40bdc5966d86571790b7a8fa0e2e0885975fc3f..353ba54db4441152feedd270b24056b1c5427bd4 100644
--- a/tools/pipe/Makefile.am
+++ b/tools/pipe/Makefile.am
@@ -10,6 +10,10 @@ endif
 
 dsl_cpe_pipe_compile_cflags = $(DSL_DRIVER_INCL_PATH) $(IFXOS_INCLUDE_PATH)
 
+if SAFEC_SUPPORT
+dsl_cpe_pipe_compile_cflags += @SAFEC_INCL_PATH@
+endif
+
 dsl_cpe_pipe_common_cflags = -Wall -Wimplicit -Wreturn-type -Wunused -Wundef \
 	-Wswitch -Wcomment -Wuninitialized -DLINUX -g -s
 
@@ -21,3 +25,8 @@ dsl_cpe_pipe_CFLAGS = $(dsl_cpe_pipe_common_cflags) \
 
 dsl_cpe_pipe_LDADD = -lifxos -lpthread -lm -lrt
 
+EXTRA_DIST = dsl_cpe_safec_wrapper.h
+
+if SAFEC_SUPPORT
+dsl_cpe_pipe_LDADD += -l@SAFEC_LIB_NAME@
+endif
\ No newline at end of file
diff --git a/tools/pipe/Makefile.in b/tools/pipe/Makefile.in
index 2b986d758a05bee8b6295d8e1c52c7ed44e4e186..f692950e67ff26ac319582fb5fcd48e5b82d9d5d 100644
--- a/tools/pipe/Makefile.in
+++ b/tools/pipe/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -87,6 +87,8 @@ NORMAL_UNINSTALL = :
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
 bin_PROGRAMS = dsl_cpe_pipe$(EXEEXT)
+@SAFEC_SUPPORT_TRUE@am__append_1 = @SAFEC_INCL_PATH@
+@SAFEC_SUPPORT_TRUE@am__append_2 = -l@SAFEC_LIB_NAME@
 subdir = tools/pipe
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/configure.in
@@ -102,7 +104,8 @@ PROGRAMS = $(bin_PROGRAMS)
 am_dsl_cpe_pipe_OBJECTS = dsl_cpe_pipe-dsl_pipe_client.$(OBJEXT) \
 	dsl_cpe_pipe-dsl_pipe_lib.$(OBJEXT)
 dsl_cpe_pipe_OBJECTS = $(am_dsl_cpe_pipe_OBJECTS)
-dsl_cpe_pipe_DEPENDENCIES =
+am__DEPENDENCIES_1 =
+dsl_cpe_pipe_DEPENDENCIES = $(am__DEPENDENCIES_1)
 dsl_cpe_pipe_LINK = $(CCLD) $(dsl_cpe_pipe_CFLAGS) $(CFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_P = $(am__v_P_@AM_V@)
@@ -246,6 +249,7 @@ INCLUDE_DSL_G997_FRAMING_PARAMETERS = @INCLUDE_DSL_G997_FRAMING_PARAMETERS@
 INCLUDE_DSL_G997_LINE_INVENTORY = @INCLUDE_DSL_G997_LINE_INVENTORY@
 INCLUDE_DSL_G997_PER_TONE = @INCLUDE_DSL_G997_PER_TONE@
 INCLUDE_DSL_G997_STATUS = @INCLUDE_DSL_G997_STATUS@
+INCLUDE_DSL_JSON_PARSING = @INCLUDE_DSL_JSON_PARSING@
 INCLUDE_DSL_PM = @INCLUDE_DSL_PM@
 INCLUDE_DSL_RESOURCE_STATISTICS = @INCLUDE_DSL_RESOURCE_STATISTICS@
 INCLUDE_DSL_SYSTEM_INTERFACE = @INCLUDE_DSL_SYSTEM_INTERFACE@
@@ -260,6 +264,8 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 LDFLAGS = @LDFLAGS@
+LIBJSON_C_INCL_PATH = @LIBJSON_C_INCL_PATH@
+LIBJSON_C_LIBRARY_PATH = @LIBJSON_C_LIBRARY_PATH@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LTLIBOBJS = @LTLIBOBJS@
@@ -274,6 +280,10 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+SAFEC_INCL_PATH = @SAFEC_INCL_PATH@
+SAFEC_LIB_NAME = @SAFEC_LIB_NAME@
+SAFEC_LIB_PATH = @SAFEC_LIB_PATH@
+SAFEC_SUPPORT = @SAFEC_SUPPORT@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -322,7 +332,8 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 @ADD_APPL_CFLAGS_SET_FALSE@dsl_cpe_pipe_cflags = 
 @ADD_APPL_CFLAGS_SET_TRUE@dsl_cpe_pipe_cflags = $(ADD_APPL_CFLAGS)
-dsl_cpe_pipe_compile_cflags = $(DSL_DRIVER_INCL_PATH) $(IFXOS_INCLUDE_PATH)
+dsl_cpe_pipe_compile_cflags = $(DSL_DRIVER_INCL_PATH) \
+	$(IFXOS_INCLUDE_PATH) $(am__append_1)
 dsl_cpe_pipe_common_cflags = -Wall -Wimplicit -Wreturn-type -Wunused -Wundef \
 	-Wswitch -Wcomment -Wuninitialized -DLINUX -g -s
 
@@ -331,7 +342,8 @@ dsl_cpe_pipe_CFLAGS = $(dsl_cpe_pipe_common_cflags) \
                       $(dsl_cpe_pipe_cflags) \
                       $(dsl_cpe_pipe_compile_cflags)
 
-dsl_cpe_pipe_LDADD = -lifxos -lpthread -lm -lrt
+dsl_cpe_pipe_LDADD = -lifxos -lpthread -lm -lrt $(am__append_2)
+EXTRA_DIST = dsl_cpe_safec_wrapper.h
 all: all-am
 
 .SUFFIXES:
diff --git a/tools/pipe/dsl_cpe_safec_wrapper.h b/tools/pipe/dsl_cpe_safec_wrapper.h
new file mode 100644
index 0000000000000000000000000000000000000000..c9e297c6169d8525d4198f985657d45b7fb51d21
--- /dev/null
+++ b/tools/pipe/dsl_cpe_safec_wrapper.h
@@ -0,0 +1,43 @@
+/******************************************************************************
+
+                     Copyright 2018 - 2019 Intel Corporation
+
+  For licensing information, see the file 'LICENSE' in the root folder of
+  this software module.
+
+******************************************************************************/
+
+#ifndef _SAFEC_WRAPPER_H
+#define _SAFEC_WRAPPER_H
+
+#if defined (SAFEC_SUPPORT)
+#include "safe_mem_lib.h"
+#include "safe_str_lib.h"
+
+#if (SAFEC_SUPPORT == 1) || (SAFEC_SUPPORT == 3)
+
+#define cpe_control_pipe_memcpy_s(dest, destsz, src, srcsz) memcpy_s(dest, destsz, src, srcsz)
+#define cpe_control_pipe_strncpy_s(dest, destsz, src, srcsz) strncpy_s(dest, destsz, src, srcsz)
+
+#else
+
+#warning "Safe C library version is unknown!"
+
+#endif /* if (SAFEC_SUPPORT == 1) elif (SAFEC_SUPPORT == 3) */
+
+#else
+
+#warning "Safe C library is not available!"
+
+#include <stddef.h>	/* size_t */
+static __inline__ size_t safec_wrapper_min(size_t a, size_t b)
+{
+   return a > b ? b : a;
+}
+
+#define cpe_control_pipe_memcpy_s(dest, destsz, src, srcsz) memcpy(dest, src, safec_wrapper_min(destsz,srcsz))
+#define cpe_control_pipe_strncpy_s(dest, destsz, src, srcsz) strncpy(dest, src, safec_wrapper_min(destsz,srcsz))
+
+#endif /* defined (SAFEC_SUPPORT) */
+
+#endif /* _SAFEC_WRAPPER_H */
diff --git a/tools/pipe/dsl_pipe_client.c b/tools/pipe/dsl_pipe_client.c
index 9d8687e9983fea66874c8e1efb0a68a74212fec2..757f6b795dfaa4145eda4c61113bfbe1c80e4115 100644
--- a/tools/pipe/dsl_pipe_client.c
+++ b/tools/pipe/dsl_pipe_client.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2019 Intel Corporation
+         Copyright 2015 - 2016 Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2009 - 2014 Lantiq Deutschland GmbH
+         Copyright 2007 - 2008 Infineon Technologies AG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -10,7 +12,6 @@
 
 #ifdef LINUX
 
-#include "dsl_cpe_config.h"
 #include "dsl_pipe_client.h"
 
 #define PIPE_PREFIX "/tmp/pipe/dsl_cpe"
@@ -132,9 +133,9 @@ static int DSL_PIPE_SemaphoreGlobalCreate(DSL_char_t *pName)
       fd = open(SYS_NAME_PREFIX, O_RDONLY);
       fchmod(fd, 0777);
       close(fd);
-      strcpy(sempath, SYS_NAME_PREFIX"/\0");
+      memset(sempath, 0, strlen(SYS_NAME_PREFIX"/") + strlen(pName) + 1);
+      cpe_control_pipe_strncpy_s(sempath, strlen(SYS_NAME_PREFIX"/") + strlen(pName) + 1, SYS_NAME_PREFIX"/\0", strlen(SYS_NAME_PREFIX"/\0"));
       strcat(sempath, pName);
-      strcat(sempath, "\0");
 
       /* creat(sempath, 0666); */
       creat(sempath, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
@@ -391,7 +392,8 @@ int main(int argc, char **argv)
          return -1;
       }
 
-      strcpy(pCommand, "help all");
+      memset(pCommand, 0, 16);
+      cpe_control_pipe_strncpy_s(pCommand, 16, "help all", sizeof("help all"));
    }
    else
    {
@@ -403,7 +405,7 @@ int main(int argc, char **argv)
          return -1;
       }
 
-      pCommand[0] = 0;
+      memset(pCommand, 0, len + 1);
       for(i=k;i<argc;i++)
       {
          strcat(pCommand, argv[i]);
@@ -429,7 +431,7 @@ int main(int argc, char **argv)
           return -1;
    }
 
-   sprintf (nameBuf, "%s%d_cmd", PIPE_PREFIX, instance);
+   snprintf(nameBuf, sizeof(nameBuf), "%s%d_cmd", PIPE_PREFIX, instance);
 
    pipe_cmd = DSL_PIPE_FOpen(nameBuf, "w");
    if (pipe_cmd == DSL_NULL)
@@ -442,7 +444,7 @@ int main(int argc, char **argv)
    DSL_PIPE_FPrintf(pipe_cmd, "%s\r\n", pCommand);
    DSL_PIPE_FClose(pipe_cmd);
 
-   sprintf (nameBuf, "%s%d_ack", PIPE_PREFIX, instance);
+   snprintf(nameBuf, sizeof(nameBuf), "%s%d_ack", PIPE_PREFIX, instance);
    pipe_ack = DSL_PIPE_FOpen(nameBuf, "r");
 
    if (pipe_ack == DSL_NULL)
diff --git a/tools/pipe/dsl_pipe_client.h b/tools/pipe/dsl_pipe_client.h
index 794777e56beed8f0670c7652bddbce5fbb22a3fd..bfa07a1d0d284eb608a5a0b2ee8ac7c390360b31 100644
--- a/tools/pipe/dsl_pipe_client.h
+++ b/tools/pipe/dsl_pipe_client.h
@@ -1,5 +1,7 @@
 /******************************************************************************
 
+                     Copyright 2018, Intel Corporation
+
                           Copyright (c) 2007-2015
                      Lantiq Beteiligungs-GmbH & Co. KG
 
@@ -11,6 +13,10 @@
 #ifndef DSL_PIPE_CLIENT_H
 #define DSL_PIPE_CLIENT_H
 
+#ifdef HAVE_CONFIG_H
+#include "dsl_cpe_config.h"
+#endif
+
 #include "drv_dsl_cpe_api_types.h"
 #include "drv_dsl_cpe_api_error.h"
 
@@ -48,6 +54,8 @@
 #include "ifxos_misc.h"
 #include "ifxos_socket.h"
 
+#include "dsl_cpe_safec_wrapper.h"
+
 #endif /* INCLUDE_DSL_CPE_IFXOS_SUPPORT*/
 
 #if defined(INCLUDE_DSL_CPE_IFXOS_SUPPORT)