diff --git a/ChangeLog b/ChangeLog
index 123fead550e924a6567cf9578d74d3e72e9ba491..7f786750d82ef1c5b50993d093490943fd8d569c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,20 +1,57 @@
 NEXT VERSION
 
-V4.20.1.2.0 - 2019-01-15
+V4.21.6 - 2019-10-14
+-
+
+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-2412) SDL compliant replacement for selection of DSL operator mode
+- VRX (CURTSYS-2310) Extend procd startup handling with priority 5 config parameters
+- VRX (CURTSYS-2308) Extend procd startup handling with priority 3 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-2302) Extend procd startup handling with usage of cmd line args
+- VRX (CURTSYS-1618) Add decoding of new LD version 2.1 to the API handling
+- VRX (CURTSYS-1572) Change default value of HlogValidation to VRX_ENABLE in
+  msg CMD_Misc_ConfigSet
+
+V4.21.3 - 2019-05-20
+common:
+- VRX (CURTSYS-1243) API returns wrong number of values for BAT
+- VRX (CURTSYS-465) Simplify the error handling on SendMessage implementation
+- VRX (CURTSYS-1202) Extend OLR Statistic counters with missing SOS values
+- VRX (CURTSYS-499) SDL: configuration handling update, XTSE cfg introduced
+- VRX (DSLCPE_SW-1179) Additional security checks for ROC and SOS
+- VRX (DSLCPE_SW-1182) Optimization and cleanup of handling within Ctrl/API
+- VRX (DSLCPE_SW-1181) Switching BND->Single via WebUI results in kernel crash
+- VRX (UGW_SW-32871) Always send FW configuration message on InstanceControlSet
+  + Also send FW message unconditionally within context of ModemWriteConfig
+
+V4.21.2 - 2019-02-14
 common:
-- VRX (DSLCPE_SW-1162) Power down handling does not work for ADSL
-- VRX (DSLCPE_SW-1097) Message dump printout is not as expected
+- VRX (DSLCPE_SW-1177) Adding missing parameters for Robust Overhead Channel (ROC)
+- VRX (GFASTSW-621) SDL: capability checks introduced (ioctl,procfs)
+- VRX (DSLCPE_SW-1166) SDL: driver autoload, CDEV and hotplug
+- VRX (DSLCPE_SW-1159) [VRX518] Simplified Modem Recovery for PPE FW stucks
 - VRX (DSLCPE_SW-1142) Integrate fixes/patches for thread handling (PM + Autoboot)
+- VRX (DSLCPE_SW-1097) Message dump printout is not as expected
+- VRX (DSLCPE_SW-1170) [VRX518] Unnecessary ~10 sec delay before
+  emergency_restart
+- VRX (DSLCPE_SW-1171) [VRX] Update MCAT header files to latest revision (Rev.3.2)
 - VRX (DSLCPE_SW-1173) [VRX518][Power Saving] Switching BND->Single
-- VRX (UGW_SW-32871) Always send FW configuration message on InstanceControlSet
+- VRX (DSLCPE_SW-1172) Functional extensions for Robust Overhead Channel (ROC)
+
+V4.21.1 - 2018-10-29
+- VRX (DSLCPE_SW-1162) Power down handling does not work for ADSL
 
-V4.20.1.2 - 2018-08-16
+V4.21.0 - 2018-08-17
 common:
 - VRX (DSLCPE_SW-1160) Release of memory within PM initialization sequence
   missing in some error conditions
-
-V4.20.1.1 - 2018-08-02
-common:
 - VRX (DSLCPE_SW-1150) Shutdown sequence does not work correctly for UGW-8.x
 
 V4.20.1 - 2018-06-28
diff --git a/Makefile.in b/Makefile.in
index c65133e7164d53fb186df2e8359c3f40b40d7900..0adf76e86372b101063cf35fe023e21bb756c297 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,
@@ -648,7 +648,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
@@ -674,7 +674,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
@@ -692,7 +692,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*) \
@@ -702,7 +702,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/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 4602f41da56abfca412289796381f40e7cef2500..228791236f024b85b682b6b9312ccc0084fc64cd 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
 #! /bin/sh
 # From configure.in Revision: 1.177 .
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for DSL CPE API driver 4.20.1.2.0.
+# Generated by GNU Autoconf 2.69 for DSL CPE API driver 4.21.6.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -577,8 +577,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='DSL CPE API driver'
 PACKAGE_TARNAME='drv_dsl_cpe_api'
-PACKAGE_VERSION='4.20.1.2.0'
-PACKAGE_STRING='DSL CPE API driver 4.20.1.2.0'
+PACKAGE_VERSION='4.21.6'
+PACKAGE_STRING='DSL CPE API driver 4.21.6'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1440,7 +1440,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 API driver 4.20.1.2.0 to adapt to many kinds of systems.
+\`configure' configures DSL CPE API driver 4.21.6 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1506,7 +1506,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of DSL CPE API driver 4.20.1.2.0:";;
+     short | recursive ) echo "Configuration of DSL CPE API driver 4.21.6:";;
    esac
   cat <<\_ACEOF
 
@@ -1697,7 +1697,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-DSL CPE API driver configure 4.20.1.2.0
+DSL CPE API driver configure 4.21.6
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1752,7 +1752,7 @@ 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 API driver $as_me 4.20.1.2.0, which was
+It was created by DSL CPE API driver $as_me 4.21.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2618,7 +2618,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='drv_dsl_cpe_api'
- VERSION='4.20.1.2.0'
+ VERSION='4.21.6'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -8776,7 +8776,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 API driver $as_me 4.20.1.2.0, which was
+This file was extended by DSL CPE API driver $as_me 4.21.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8842,7 +8842,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 API driver config.status 4.20.1.2.0
+DSL CPE API driver 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 cb8784337408170f5b732d4c988c256fbdaeb608..145467052a52147dad3f0a9ccc0b433d40e83701 100644
--- a/configure.in
+++ b/configure.in
@@ -1,7 +1,7 @@
 
 AC_REVISION($Revision: 1.177 $)
 
-AC_INIT([DSL CPE API driver],[4.20.1.2.0],[],[drv_dsl_cpe_api])
+AC_INIT([DSL CPE API driver],[4.21.6],[],[drv_dsl_cpe_api])
 
 AC_CONFIG_SRCDIR(src/Makefile.am)
 AM_INIT_AUTOMAKE([tar-pax])
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/doc/doxyconfig.vrx b/doc/doxyconfig.vrx
index 048f9774adcb39d4db17c0d293059dfa7941eee1..a16a9c23e6c8e23f5730032dd22eb629320a939c 100644
--- a/doc/doxyconfig.vrx
+++ b/doc/doxyconfig.vrx
@@ -22,7 +22,7 @@ PROJECT_NAME           = "DSL CPE API"
 # This could be handy for archiving the generated documentation or
 # if some version control system is used.
 
-PROJECT_NUMBER         = 4.20.1.2.0
+PROJECT_NUMBER         = 4.21.6
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
 # base path where the generated documentation will be put.
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 ca13c84b84e641be885099bec75938306d00fed4..03461d0a2a5d4b2048aa89a533402c76315161da 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -19,7 +19,7 @@ endif
 if FW_R9
 VRX_HEADER_DIR = include/mcat2.7
 else
-VRX_HEADER_DIR = include/mcat3.1
+VRX_HEADER_DIR = include/mcat3.2
 endif
 
 
@@ -159,13 +159,13 @@ drv_vrx_specific_extra = \
 	include/mcat2.7/drv_dsl_cpe_vrx_msg_olr.h \
 	include/mcat2.7/drv_dsl_cpe_vrx_msg_perf_pmd.h \
 	include/mcat2.7/drv_dsl_cpe_vrx_msg_tc_counters.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_config_pmd.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_const.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_dmt_scope.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_ghs_status.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_olr.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_perf_pmd.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_tc_counters.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_config_pmd.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_const.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_dmt_scope.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_ghs_status.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_olr.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_perf_pmd.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_tc_counters.h \
 	include/drv_dsl_cpe_vrx_ctx.h \
 	../scripts/inst_drv_dsl_cpe_api_vrx.sh
 
diff --git a/src/Makefile.in b/src/Makefile.in
index 36846b571de6e3a9e8d2f4a55d407aab684e9e31..0012a284855e7a0ee6235cbaef25dd2f24ba4aa2 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,
@@ -479,7 +479,7 @@ top_srcdir = @top_srcdir@
 @DSL_CPE_API_LIBRARY_BUILD_2_6_TRUE@@KERNEL_2_6_TRUE@noinst_LIBRARIES = lib_dsl_cpe_api.a
 @KERNEL_2_6_FALSE@noinst_LIBRARIES = lib_dsl_cpe_api.a
 @DEVICE_DANUBE_TRUE@bin_SCRIPTS = ../scripts/inst_drv_dsl_cpe_api_danube.sh
-@FW_R9_FALSE@VRX_HEADER_DIR = include/mcat3.1
+@FW_R9_FALSE@VRX_HEADER_DIR = include/mcat3.2
 @FW_R9_TRUE@VRX_HEADER_DIR = include/mcat2.7
 drv_dsl_cpe_api_includedir = $(includedir)
 drv_dsl_cpe_api_include_HEADERS = include/drv_dsl_cpe*.h
@@ -591,13 +591,13 @@ drv_vrx_specific_extra = \
 	include/mcat2.7/drv_dsl_cpe_vrx_msg_olr.h \
 	include/mcat2.7/drv_dsl_cpe_vrx_msg_perf_pmd.h \
 	include/mcat2.7/drv_dsl_cpe_vrx_msg_tc_counters.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_config_pmd.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_const.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_dmt_scope.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_ghs_status.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_olr.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_perf_pmd.h \
-	include/mcat3.1/drv_dsl_cpe_vrx_msg_tc_counters.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_config_pmd.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_const.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_dmt_scope.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_ghs_status.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_olr.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_perf_pmd.h \
+	include/mcat3.2/drv_dsl_cpe_vrx_msg_tc_counters.h \
 	include/drv_dsl_cpe_vrx_ctx.h \
 	../scripts/inst_drv_dsl_cpe_api_vrx.sh
 
diff --git a/src/bnd/drv_dsl_cpe_api_bnd.c b/src/bnd/drv_dsl_cpe_api_bnd.c
index 895109ba576592cbd2f9b775deb0756e542bc6d6..e7b3c92647091f64f5c9951bb77cf87e04b2488e 100644
--- a/src/bnd/drv_dsl_cpe_api_bnd.c
+++ b/src/bnd/drv_dsl_cpe_api_bnd.c
@@ -10,6 +10,9 @@
 #define DSL_INTERN
 
 #include "drv_dsl_cpe_api.h"
+#ifdef __LINUX__
+#include <linux/capability.h>
+#endif /* __LINUX__ */
 
 #ifdef __cplusplus
    extern "C" {
@@ -29,6 +32,14 @@ DSL_Error_t DSL_DRV_BND_HwInit(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -62,6 +73,14 @@ DSL_Error_t DSL_DRV_BND_ConfigSet(
    DSL_TcLayerSelection_t nTcMode = DSL_TC_UNKNOWN;
 #endif
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -156,6 +175,14 @@ DSL_Error_t DSL_DRV_BND_ConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -187,6 +214,14 @@ DSL_Error_t DSL_DRV_BND_HsStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -249,6 +284,14 @@ DSL_Error_t DSL_DRV_BND_HsContinue(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -276,6 +319,14 @@ DSL_Error_t DSL_DRV_BND_EthDbgCountersGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -303,6 +354,14 @@ DSL_Error_t DSL_DRV_BND_EthCountersGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -326,6 +385,14 @@ DSL_Error_t DSL_DRV_BND_PortModeSyncSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
diff --git a/src/common/drv_dsl_cpe_api.c b/src/common/drv_dsl_cpe_api.c
index 1391dac64f91413bb16e4770327b016074894fbe..29f5d3edf0240f48d5339a400b41b4453843c69e 100644
--- a/src/common/drv_dsl_cpe_api.c
+++ b/src/common/drv_dsl_cpe_api.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.
@@ -12,6 +14,9 @@
 
 #include "drv_dsl_cpe_api.h"
 #include "drv_dsl_cpe_api_ioctl.h"
+#ifdef __LINUX__
+#include <linux/capability.h>
+#endif /* __LINUX__ */
 
 #ifdef __cplusplus
    extern "C" {
@@ -49,6 +54,48 @@ DSL_uint8_t g_XTSEposs[DSL_G997_NUM_XTSE_OCTETS] =
 /* G994 Vendor ID */
 static const DSL_uint8_t g_G994VendorID[DSL_G997_LI_MAXLEN_VENDOR_ID] = {DSL_G994_VENDOR_ID};
 
+#if defined(DSL_VRX_DEVICE_VR11)
+/* IOctls which are not sending any msg to FW.
+   Frequency usage order. */
+static DSL_uint32_t g_VRxPD_IOctlWhitelist[] =
+{
+   DSL_FIO_EVENT_STATUS_GET,
+   DSL_FIO_EVENT_STATUS_MASK_CONFIG_SET,
+   DSL_FIO_AUTOBOOT_STATUS_GET,
+   DSL_FIO_G997_LINE_INVENTORY_GET,
+   DSL_FIO_LINE_STATE_GET,
+   DSL_FIO_LINE_FEATURE_CONFIG_GET,
+   DSL_FIO_LINE_FEATURE_STATUS_GET,
+   DSL_FIO_G997_XTU_SYSTEM_ENABLING_STATUS_GET,
+   DSL_FIO_G997_LINE_INIT_STATUS_GET,
+   DSL_FIO_AUTOBOOT_CONFIG_GET,
+   DSL_FIO_AUTOBOOT_CONFIG_SET,
+   DSL_FIO_AUTOBOOT_CONTROL_SET,
+   DSL_FIO_FIRMWARE_DOWNLOAD_STATUS_GET,
+   DSL_FIO_G997_LAST_STATE_TRANSMITTED_GET,
+   DSL_FIO_G997_LINE_INVENTORY_SET,
+   DSL_FIO_G997_POWER_MANAGEMENT_STATUS_GET,
+   DSL_FIO_G997_RATE_ADAPTATION_CONFIG_SET,
+   DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_GET,
+   DSL_FIO_G997_XTU_SYSTEM_ENABLING_CONFIG_SET,
+   DSL_FIO_LINE_FEATURE_CONFIG_SET,
+   DSL_FIO_SHOWTIME_LOGGING_DATA_GET,
+   DSL_FIO_SYSTEM_INTERFACE_CONFIG_GET,
+   DSL_FIO_SYSTEM_INTERFACE_CONFIG_SET,
+   DSL_FIO_SYSTEM_INTERFACE_STATUS_GET,
+   DSL_FIO_BAND_PLAN_SUPPORT_GET,
+   DSL_FIO_BAND_PLAN_STATUS_GET,
+   DSL_FIO_DBG_MODULE_LEVEL_GET,
+   DSL_FIO_DBG_MODULE_LEVEL_SET,
+   DSL_FIO_DBG_MODULE_DESTINATION_GET,
+   DSL_FIO_DBG_MODULE_DESTINATION_SET,
+   DSL_FIO_OPERATOR_CONFIG_GET,
+   DSL_FIO_OPERATOR_CONFIG_SET,
+   /* Delimeter only. Keep it! */
+   0xFFFFFFFF
+};
+#endif
+
 /*
    For a detailed description of the function, its arguments and return value
    please refer to the description in the header file 'drv_dsl_cpe_intern.h'
@@ -121,6 +168,35 @@ DSL_Error_t DSL_DRV_HandleLinitValue(
    DSL_G997_LineInitStatusData_t lineInitStatus;
    DSL_uint32_t nCount = 0;
 
+   switch(nSub)
+   {
+      case LINIT_SUB_S_REBOOT_REQ:
+      {
+         DSL_DEBUG(DSL_DBG_ERR,
+            (pContext, SYS_DBG_ERR"DSL[%02d]: PPE-FW stuck detected. Calling emergency restart now!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+         DSL_DRV_MSecSleep(200);
+
+         DSL_DRV_EMERGENCY_RESTART;
+
+         return nErrCode;
+      }
+      case LINIT_SUB_S_AUTOMSG:
+      {
+         DSL_DEBUG(DSL_DBG_WRN,
+            (pContext, SYS_DBG_WRN"DSL[%02d]: DSL-FW does not support autonomous messages." \
+            " Switching back to polling mode."
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+         DSL_CTX_WRITE_SCALAR(pContext, nErrCode, bFwEventActivation, DSL_FALSE);
+
+         break;
+      }
+      default:
+         break;
+   }
+
+
    lineInitStatus.nLineInitStatus    = nLinit;
    lineInitStatus.nLineInitSubStatus = nSub;
 
@@ -297,6 +373,14 @@ static DSL_Error_t DSL_DRV_InstanceStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -328,6 +412,318 @@ static DSL_Error_t DSL_DRV_InstanceStatusGet(
    return(nErrCode);
 }
 
+static DSL_Error_t DSL_DRV_InstanceControlSet(
+   DSL_OpenContext_t *pOpenCtx,
+   DSL_IN DSL_Context_t *pContext,
+   DSL_IN_OUT DSL_InstanceControl_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_EventStatusData_t event;
+   DSL_boolean_t bEventActivation = DSL_FALSE;
+   DSL_boolean_t bFwEventActivation = DSL_FALSE;
+   DSL_BF_ResourceActivationType_t nResourceActivationMask = { 0 };
+   DSL_DEV_Handle_t dev = DSL_NULL;
+   DSL_Error_t nCtxRWErrCode = DSL_ERROR;
+   DSL_uint32_t nOppositeLine = 0;
+#if defined (DSL_VRX_DEVICE_VR11)
+   DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+#endif
+
+   DSL_CHECK_CTX_POINTER(pContext);
+   DSL_CHECK_ERR_CODE();
+
+   if (pOpenCtx == DSL_NULL)
+   {
+      nErrCode = DSL_ERR_POINTER;
+      DSL_CHECK_ERR_CODE();
+   }
+
+   DSL_DEBUG(DSL_DBG_MSG,
+      (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_InstanceControlSet"DSL_DRV_CRLF,
+      DSL_DEV_NUM(pContext)));
+
+   /* Lock Open Context list*/
+   if (DSL_DRV_MUTEX_LOCK(pContext->pDevCtx->openContextListMutex))
+   {
+      DSL_DEBUG( DSL_DBG_ERR,
+         (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: ERROR - Couldn't lock Context List mutex!"
+         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+      nErrCode = DSL_ERR_SEMAPHORE_GET;
+      return nErrCode;
+   }
+
+   /*
+      Process Event Activation Control settings
+   */
+   if(DSL_DRV_MUTEX_LOCK(pOpenCtx->eventMutex))
+   {
+      DSL_DEBUG( DSL_DBG_ERR,
+         (pContext, SYS_DBG_ERR"DSL[%02d]: Couldn't lock event mutex"
+         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+      nErrCode = DSL_ERROR;
+   }
+   else
+   {
+      /* Get bEventActivation flag*/
+      bEventActivation = pData->data.bEventActivation;
+      /* Get nResourceActivationMask data*/
+      nResourceActivationMask = pData->data.nResourceActivationMask;
+      bFwEventActivation = pData->data.bFwEventActivation;
+
+      if (bEventActivation == DSL_FALSE)
+      {
+         DSL_DRV_MUTEX_UNLOCK(pOpenCtx->eventMutex);
+         /** free event structures */
+         if (pOpenCtx->eventFifo != DSL_NULL && pOpenCtx->eventFifoBuf != DSL_NULL)
+         {
+            while (!DSL_Fifo_isEmpty(pOpenCtx->eventFifo))
+            {
+               if (DSL_DRV_EventUnqueue(pOpenCtx, &event) >= DSL_SUCCESS)
+               {
+                  if (event.pData != DSL_NULL)
+                  {
+                              DSL_DRV_VFree(event.pData);
+                  }
+               }
+            }
+         }
+
+         if(DSL_DRV_MUTEX_LOCK(pOpenCtx->eventMutex))
+         {
+            DSL_DEBUG( DSL_DBG_ERR,
+               (pContext, SYS_DBG_ERR"DSL[%02d]: Couldn't lock event mutex"
+               DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+            nErrCode = DSL_ERROR;
+         }
+         else
+         {
+            /* release event structures */
+            if (pOpenCtx->eventFifo != DSL_NULL)
+            {
+               DSL_DRV_VFree(pOpenCtx->eventFifo);
+               pOpenCtx->eventFifo = DSL_NULL;
+            }
+
+            /* release event structures */
+            if (pOpenCtx->eventFifoBuf != DSL_NULL)
+            {
+               DSL_DRV_VFree(pOpenCtx->eventFifoBuf);
+               pOpenCtx->eventFifoBuf = DSL_NULL;
+            }
+         }
+      }
+      else
+      {
+         /* initialize event structures */
+         pOpenCtx->eventFifo = DSL_DRV_VMalloc(sizeof(DSL_FIFO));
+         if (pOpenCtx->eventFifo == DSL_NULL)
+         {
+            DSL_DEBUG(DSL_DBG_ERR,
+               (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Open failed, "
+               "could not allocate memory for event FIFO..."DSL_DRV_CRLF,
+               DSL_DEV_NUM(pContext)));
+            nErrCode = DSL_ERR_MEMORY;
+         }
+         else
+         {
+            pOpenCtx->eventFifoBuf = DSL_DRV_VMalloc(DSL_EVENT_FIFO_ELEMENT_COUNT
+               * sizeof(DSL_EventStatusData_t));
+            if (pOpenCtx->eventFifoBuf == DSL_NULL)
+            {
+               DSL_DEBUG(DSL_DBG_ERR,
+                  (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Open failed, "
+                  "could not allocate memory for event FIFO..."DSL_DRV_CRLF,
+                  DSL_DEV_NUM(pContext)));
+               DSL_DRV_VFree(pOpenCtx->eventFifo);
+               nErrCode = DSL_ERR_MEMORY;
+            }
+            else
+            {
+               /* init event fifo */
+               if (DSL_Fifo_Init(pOpenCtx->eventFifo,
+                  pOpenCtx->eventFifoBuf,
+                  pOpenCtx->eventFifoBuf +
+                     (DSL_EVENT_FIFO_ELEMENT_COUNT - 1) *
+                     sizeof(DSL_EventStatusData_t),
+                  sizeof(DSL_EventStatusData_t)) != 0)
+               {
+                  DSL_DEBUG(DSL_DBG_ERR,
+                     (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Internal error in the DSL "
+                     "CPE API. Could not prepare FIFO for the events."DSL_DRV_CRLF,
+                     DSL_DEV_NUM(pContext)));
+                  DSL_DRV_VFree(pOpenCtx->eventFifoBuf);
+                  DSL_DRV_VFree(pOpenCtx->eventFifo);
+                  nErrCode = DSL_ERR_INTERNAL;
+               }
+            }
+         }
+      }
+
+      pOpenCtx->bEventActivation = bEventActivation;
+      pOpenCtx->nResourceActivationMask = nResourceActivationMask;
+
+      /* Try to enable event base mode (FW autonomous messages) instead of polling */
+#if defined (DSL_VRX_DEVICE_VR11)
+      DSL_DRV_VRX_FirmwareVersionCheck(pContext, DSL_MIN_FW_VERSION_VR11_R5, &nVerCheck);
+      if (bFwEventActivation && nVerCheck >= DSL_VERSION_EQUAL)
+      {
+         DSL_CTX_WRITE_SCALAR(pContext, nCtxRWErrCode, bFwEventActivation, DSL_TRUE);
+         DSL_SET_ERROR_CODE(nCtxRWErrCode, nErrCode);
+      }
+      else
+      {
+         DSL_SET_ERROR_CODE(DSL_WRN_CONFIG_PARAM_IGNORED, nErrCode);
+         DSL_CTX_WRITE_SCALAR(pContext, nCtxRWErrCode, bFwEventActivation, DSL_FALSE);
+         DSL_SET_ERROR_CODE(nCtxRWErrCode, nErrCode);
+      }
+#else
+      DSL_SET_ERROR_CODE(DSL_WRN_CONFIG_PARAM_IGNORED, nErrCode);
+      DSL_CTX_WRITE_SCALAR(pContext, nCtxRWErrCode, bFwEventActivation, DSL_FALSE);
+      DSL_SET_ERROR_CODE(nCtxRWErrCode, nErrCode);
+#endif /* defined (DSL_VRX_DEVICE_VR11) */
+
+      DSL_CTX_READ_SCALAR(pContext, nCtxRWErrCode, bFwEventActivation, bFwEventActivation);
+      DSL_SET_ERROR_CODE(nCtxRWErrCode, nErrCode);
+
+      dev = pContext->pDevCtx->nfc_lowHandle;
+
+      if (bFwEventActivation)
+      {
+         if(DSL_DRV_VRX_InternalNfcCallBackDataSet((MEI_DYN_CNTRL_T*)dev,
+                                          (void *)DSL_DRV_AutobootSignalDeviceEvt,
+                                          (void *)pContext) < 0)
+         {
+            DSL_DEBUG( DSL_DBG_ERR, (pContext,
+               SYS_DBG_ERR"DSL[%02d]: ERROR - VRx NFC set callback failed!"
+               DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+         }
+      }
+      else
+      {
+         if(DSL_DRV_VRX_InternalNfcCallBackDataSet((MEI_DYN_CNTRL_T*)dev,
+                                                   DSL_NULL,
+                                                   DSL_NULL) < 0)
+         {
+            DSL_DEBUG( DSL_DBG_ERR, (pContext,
+               SYS_DBG_ERR"DSL[%02d]: ERROR - VRx NFC clear callback failed!"
+               DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+            nErrCode = DSL_ERROR;
+         }
+      }
+
+      /* Try to send but do not forward error in case of very early cli ics execute */
+      DSL_DRV_VRX_SendMsgModemFSMEventConfigure(pContext, bFwEventActivation);
+
+      if (DSL_DRV_BONDING_ENABLED && DSL_DRV_LINES_PER_DEVICE == 1)
+      {
+         nOppositeLine = (DSL_DEV_NUM(pContext) + 1) % DSL_DRV_ENTITIES;
+
+         if (ifxDevices[nOppositeLine].pContext != DSL_NULL)
+         {
+            ifxDevices[nOppositeLine].pContext->bFwEventActivation = bFwEventActivation;
+         }
+         else
+         {
+            DSL_DEBUG( DSL_DBG_WRN, (pContext,
+               SYS_DBG_WRN"DSL[%02d]: WARNING - Bonding enabled but "
+               "opposite line context not initialized!"
+               DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+         }
+      }
+
+      DSL_DRV_MUTEX_UNLOCK(pOpenCtx->eventMutex);
+   }
+
+   /*
+      Process Resource activation settings
+   */
+#ifdef INCLUDE_DSL_CEOC
+   if(DSL_DRV_MUTEX_LOCK(pOpenCtx->rxSnmpFifoMutex))
+   {
+      DSL_DEBUG( DSL_DBG_ERR,
+         (pContext, SYS_DBG_ERR"DSL[%02d]: Couldn't lock Rx SNMP FIFO mutex"
+         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+      nErrCode = DSL_ERR_SEMAPHORE_GET;
+   }
+   else
+   {
+      if (nResourceActivationMask & DSL_RESOURCE_ACTIVATION_SNMP)
+      {
+         /* release event structures */
+         if (pOpenCtx->rxSnmpFifo != DSL_NULL)
+         {
+            DSL_DRV_VFree(pOpenCtx->rxSnmpFifo);
+            pOpenCtx->rxSnmpFifo = DSL_NULL;
+         }
+
+         /* release event structures */
+         if (pOpenCtx->rxSnmpFifoBuf != DSL_NULL)
+         {
+            DSL_DRV_VFree(pOpenCtx->rxSnmpFifoBuf);
+            pOpenCtx->rxSnmpFifoBuf = DSL_NULL;
+         }
+      }
+      else
+      {
+         /* initialize event structures */
+         pOpenCtx->rxSnmpFifo = DSL_DRV_VMalloc(sizeof(DSL_FIFO));
+         if (pOpenCtx->rxSnmpFifo == DSL_NULL)
+         {
+            DSL_DEBUG(DSL_DBG_ERR,
+               (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Could not allocate memory for SNMP FIFO!!!"
+               DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+            nErrCode = DSL_ERR_MEMORY;
+         }
+         else
+         {
+            pOpenCtx->rxSnmpFifoBuf =
+               DSL_DRV_VMalloc(DSL_CEOC_RX_FIFO_ELEMENT_COUNT * sizeof(DSL_G997_SnmpData_t));
+            if (pOpenCtx->rxSnmpFifoBuf == DSL_NULL)
+            {
+               DSL_DEBUG(DSL_DBG_ERR,
+                  (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Could not allocate memory for SNMP FIFO buffer!!!"
+                  DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+               DSL_DRV_VFree(pOpenCtx->rxSnmpFifo);
+               nErrCode = DSL_ERR_MEMORY;
+            }
+            else
+            {
+               /* init event fifo */
+               if (DSL_Fifo_Init(
+                     pOpenCtx->rxSnmpFifo,
+                     pOpenCtx->rxSnmpFifoBuf,
+                     pOpenCtx->rxSnmpFifoBuf +
+                        sizeof(DSL_CEOC_Message_t)*(DSL_CEOC_RX_FIFO_ELEMENT_COUNT - 1),
+                     sizeof(DSL_CEOC_Message_t)) != 0)
+                  {
+                     DSL_DEBUG(DSL_DBG_ERR,
+                        (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Internal error in the DSL "
+                        "CPE API. Could not prepare FIFO for the events."DSL_DRV_CRLF,
+                        DSL_DEV_NUM(pContext)));
+                     DSL_DRV_VFree(pOpenCtx->rxSnmpFifoBuf);
+                     DSL_DRV_VFree(pOpenCtx->rxSnmpFifo);
+                     nErrCode = DSL_ERR_INTERNAL;
+                  }
+            }
+         }
+      }
+      pOpenCtx->nResourceActivationMask = nResourceActivationMask;
+      DSL_DRV_MUTEX_UNLOCK(pOpenCtx->rxSnmpFifoMutex);
+   }
+#endif /* #ifdef INCLUDE_DSL_CEOC*/
+
+   /* Unlock Open Context list*/
+   DSL_DRV_MUTEX_UNLOCK(pContext->pDevCtx->openContextListMutex);
+
+   DSL_DEBUG(DSL_DBG_MSG,
+      (pContext, SYS_DBG_MSG"DSL[%02d]: OUT - DSL_InstanceControlSet, retCode=%d"
+      DSL_DRV_CRLF, DSL_DEV_NUM(pContext), nErrCode));
+
+   return(nErrCode);
+}
+
 /*
    For a detailed description of the function, its arguments and return value
    please refer to the description in the header file 'drv_dsl_cpe_intern.h'
@@ -998,15 +1394,21 @@ DSL_Error_t DSL_DRV_Init(
    DSL_boolean_t bFwRequest = DSL_FALSE;
 #endif /* INCLUDE_FW_REQUEST_SUPPORT*/
    DSL_FirmwareRequestType_t nFwType = DSL_FW_REQUEST_NA;
-#ifndef DSL_DEBUG_DISABLE
-   #if defined(INCLUDE_DSL_CPE_API_VRX)
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+   #ifndef DSL_DEBUG_DISABLE
       DSL_DBG_ModuleLevel_t dbgModLev;
    #endif /* #ifndef DSL_DEBUG_DISABLE*/
+   #if defined(DSL_VRX_DEVICE_VR11)
+      DSL_boolean_t bRocEnable = DSL_FALSE, bSosEnable = DSL_FALSE;
+      DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+      ACK_VDSL_FeatureMapGet_t nFeatureMapGetAck = { 0 };
+   #endif /* DSL_VRX_DEVICE_VR11 */
 #endif /* INCLUDE_DSL_CPE_API_VRX */
 #if (INCLUDE_DSL_CPE_API_VDSL_SUPPORT == 1)
    DSL_PortMode_t nPortMode;
 #endif /* (INCLUDE_DSL_CPE_API_VDSL_SUPPORT == 1)*/
 
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -1029,6 +1431,8 @@ DSL_Error_t DSL_DRV_Init(
       return DSL_WRN_ALREADY_INITIALIZED;
    }
 
+   pContext->bFeaturesEnabled = DSL_FALSE;
+
 #ifndef DSL_DEBUG_DISABLE
    #if defined(INCLUDE_DSL_CPE_API_VRX)
       /* Take care that initial value for low level (MEI) driver are configured */
@@ -1153,6 +1557,9 @@ DSL_Error_t DSL_DRV_Init(
 
    pContext->lineFeatureDataCfg[DSL_MODE_ADSL][DSL_UPSTREAM].b20BitSupport = DSL_FEATURE_NA;
 
+   pContext->lineFeatureDataCfg[DSL_MODE_ADSL][DSL_UPSTREAM].bRocEnable = DSL_FEATURE_DISABLED;
+   pContext->lineFeatureDataCfg[DSL_MODE_ADSL][DSL_DOWNSTREAM].bRocEnable = DSL_FEATURE_DISABLED;
+
 #ifdef INCLUDE_DSL_CPE_API_DANUBE
    pContext->lineFeatureDataCfg[DSL_MODE_ADSL][DSL_DOWNSTREAM].b20BitSupport = DSL_FEATURE_DISABLED;
 #else
@@ -1174,6 +1581,9 @@ DSL_Error_t DSL_DRV_Init(
 
    pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_UPSTREAM].bVirtualNoiseSupport = DSL_TRUE;
    pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_DOWNSTREAM].bVirtualNoiseSupport = DSL_TRUE;
+
+   pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_UPSTREAM].bRocEnable = DSL_FEATURE_DISABLED;
+   pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_DOWNSTREAM].bRocEnable = DSL_FEATURE_DISABLED;
 #endif /* INCLUDE_DSL_CPE_API_VRX*/
 
    pContext->powerMgmtStatus.nPowerManagementStatus = DSL_G997_PMS_L3;
@@ -1218,6 +1628,9 @@ DSL_Error_t DSL_DRV_Init(
 
    DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
 
+   pContext->nFwEventLastReadErr = DSL_ERROR;
+   pContext->nFwEventLineState = DSL_LINESTATE_UNKNOWN;
+
    /* Initialize device specific parameters*/
    nErrCode = DSL_DRV_DEV_DeviceInit(pContext, pData);
    if( nErrCode != DSL_SUCCESS )
@@ -1300,6 +1713,80 @@ DSL_Error_t DSL_DRV_Init(
          return nErrCode;
       }
 
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+#if defined(DSL_VRX_DEVICE_VR11)
+      /* Enable ROC and SOS, if supported by the FW and ReTx enabled */
+      if (pContext->
+         lineFeatureDataCfg[DSL_MODE_VDSL][DSL_UPSTREAM].bReTxEnable == DSL_TRUE ||
+         pContext->
+         lineFeatureDataCfg[DSL_MODE_VDSL][DSL_DOWNSTREAM].bReTxEnable == DSL_TRUE)
+      {
+         /* minimum FW version for ROC is R6 */
+         nErrCode = DSL_DRV_VRX_FirmwareVersionCheck(pContext, DSL_MIN_FW_VERSION_VR11_R6
+            , &nVerCheck);
+         if (nErrCode == DSL_SUCCESS)
+         {
+            if (nVerCheck >= DSL_VERSION_EQUAL)
+            {
+               nErrCode = DSL_DRV_VRX_SendMsgFeatureMapGet(pContext, (DSL_uint8_t *)&nFeatureMapGetAck);
+               if (nErrCode == DSL_SUCCESS)
+               {
+                  /* for ROC, related FeatureMap bit WOF15 has to be enabled */
+                  if (nFeatureMapGetAck.W0F15 == VRX_ENABLE)
+                  {
+                     bRocEnable = DSL_TRUE;
+                     /* for SOS, related FeatureMap bit WOF13 has to be enabled */
+                     if (nFeatureMapGetAck.W0F13 == VRX_ENABLE)
+                     {
+                        bSosEnable = DSL_TRUE;
+                     }
+                  }
+               }
+               else
+               {
+                  DSL_DEBUG(DSL_DBG_WRN,
+                     (pContext, SYS_DBG_WRN"DSL[%02d]: FeatureMap get failed!"
+                     DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+               }
+            }
+         }
+         else
+         {
+            DSL_DEBUG(DSL_DBG_ERR,
+               (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FW version check failed!"
+               DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+         }
+      }
+
+      if (bRocEnable == DSL_TRUE)
+      {
+         /* US direction */
+         if (pContext->
+            lineFeatureDataCfg[DSL_MODE_VDSL][DSL_UPSTREAM].bReTxEnable == DSL_TRUE)
+         {
+            pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_UPSTREAM].bRocEnable = DSL_FEATURE_ENABLED;
+            if (bSosEnable == DSL_TRUE)
+            {
+               pContext->rateAdaptationMode[DSL_MODE_VDSL][DSL_UPSTREAM] = DSL_G997_RA_MODE_DYNAMIC_SOS;
+            }
+         }
+
+         /* DS direction */
+         if (pContext->
+            lineFeatureDataCfg[DSL_MODE_VDSL][DSL_DOWNSTREAM].bReTxEnable == DSL_TRUE)
+         {
+            pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_DOWNSTREAM].bRocEnable = DSL_FEATURE_ENABLED;
+            if (bSosEnable == DSL_TRUE)
+            {
+               pContext->rateAdaptationMode[DSL_MODE_VDSL][DSL_DOWNSTREAM] = DSL_G997_RA_MODE_DYNAMIC_SOS;
+            }
+         }
+
+         pContext->bFeaturesEnabled = DSL_TRUE;
+      }
+#endif /* DSL_VRX_DEVICE_VR11 */
+#endif /* INCLUDE_DSL_CPE_API_VRX */
+
       /* Start Autoboot handling if allowed*/
       if( pData->data.nAutobootStartupMode != DSL_AUTOBOOT_CTRL_STOP )
       {
@@ -1355,10 +1842,6 @@ DSL_Error_t DSL_DRV_Init(
    /* Set LINIT value to LINIT_UNKNOWN*/
    DSL_CTX_WRITE_SCALAR(pContext, nErrCode, lineInitStatus.nLineInitStatus, LINIT_UNKNOWN);
 
-#if defined(DSL_VRX_DEVICE_VR11)
-   DSL_CTX_WRITE_SCALAR(pContext, nErrCode, bFwEventActivation, DSL_TRUE);
-#endif
-
    pContext->bInitComplete = DSL_TRUE;
 
    /* Generate DSL_EVENT_S_INIT_READY event*/
@@ -1486,6 +1969,21 @@ DSL_Error_t DSL_DRV_AutobootLoadFirmware(
    DSL_int32_t nWaitCount = 0;
    DSL_Autoboot_State_t nState = DSL_AUTOBOOTSTATE_UNKNOWN;
    DSL_uint8_t *pFirmware = DSL_NULL, *pFirmware2 = DSL_NULL;
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+   DSL_boolean_t bRocSupported = DSL_FALSE, bSosSupported = DSL_FALSE;
+#if defined(DSL_VRX_DEVICE_VR11)
+   DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+   ACK_VDSL_FeatureMapGet_t nFeatureMapGetAck = { 0 };
+#endif /* DSL_VRX_DEVICE_VR11 */
+#endif /* INCLUDE_DSL_CPE_API_VRX */
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
 
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
@@ -1690,11 +2188,100 @@ DSL_Error_t DSL_DRV_AutobootLoadFirmware(
             if (nErrCode != DSL_SUCCESS)
             {
                DSL_DEBUG(DSL_DBG_ERR,
-                 (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FW store failed!"
-                 DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+                 (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FW store failed!"
+                 DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+            }
+         }
+#endif /* INCLUDE_FW_REQUEST_SUPPORT*/
+
+         /* Check if ROC and SOS are still supported by the FW, disable if not */
+#if defined(INCLUDE_DSL_CPE_API_VRX)
+#if defined(DSL_VRX_DEVICE_VR11)
+         if (pContext->
+            lineFeatureDataCfg[DSL_MODE_VDSL][DSL_UPSTREAM].bReTxEnable == DSL_TRUE ||
+            pContext->
+            lineFeatureDataCfg[DSL_MODE_VDSL][DSL_DOWNSTREAM].bReTxEnable == DSL_TRUE)
+         {
+            /* Minimum FW version for ROC is R6 */
+            nErrCode = DSL_DRV_VRX_FirmwareVersionCheck(pContext,
+               DSL_MIN_FW_VERSION_VR11_R6, &nVerCheck);
+            if (nErrCode == DSL_SUCCESS)
+            {
+               if (nVerCheck >= DSL_VERSION_EQUAL)
+               {
+                  /* set the features only once */
+                  if (pContext->bFeaturesEnabled == DSL_FALSE)
+                  {
+                     nErrCode = DSL_DRV_VRX_SendMsgFeatureMapGet(pContext, (DSL_uint8_t *)&nFeatureMapGetAck);
+                     if (nErrCode == DSL_SUCCESS)
+                     {
+                        /* For ROC, related FeatureMap bit WOF15 has to be enabled */
+                        if (nFeatureMapGetAck.W0F15 == VRX_ENABLE)
+                        {
+                           bRocSupported = DSL_TRUE;
+                           /* For SOS, related FeatureMap bit WOF13 has to be enabled */
+                           if (nFeatureMapGetAck.W0F13 == VRX_ENABLE)
+                           {
+                              bSosSupported = DSL_TRUE;
+                           }
+                        }
+                     }
+                     else
+                     {
+                        DSL_DEBUG(DSL_DBG_ERR,
+                           (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FeatureMap get failed!"
+                              DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+                     }
+                  }
+               }
+            }
+            else
+            {
+               DSL_DEBUG(DSL_DBG_ERR,
+                  (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FW version check failed!"
+                  DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
             }
          }
-#endif /* INCLUDE_FW_REQUEST_SUPPORT*/
+#endif /* DSL_VRX_DEVICE_VR11 */
+
+         /* if supported, enable by default */
+         if (bRocSupported == DSL_TRUE)
+         {
+            /* Enable ROC */
+            pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_UPSTREAM].bRocEnable = DSL_FEATURE_ENABLED;
+            pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_DOWNSTREAM].bRocEnable = DSL_FEATURE_ENABLED;
+
+            if (bSosSupported == DSL_TRUE)
+            {
+               pContext->rateAdaptationMode[DSL_MODE_VDSL][DSL_UPSTREAM] = DSL_G997_RA_MODE_DYNAMIC_SOS;
+               pContext->rateAdaptationMode[DSL_MODE_VDSL][DSL_DOWNSTREAM] = DSL_G997_RA_MODE_DYNAMIC_SOS;
+            }
+            else
+            {
+               /* Restore rateAdaptationMode to its default */
+               pContext->rateAdaptationMode[DSL_MODE_VDSL][DSL_UPSTREAM] =
+                  DSL_G997_RA_MODE_DYNAMIC;
+               pContext->rateAdaptationMode[DSL_MODE_VDSL][DSL_DOWNSTREAM] =
+                  DSL_G997_RA_MODE_DYNAMIC;
+            }
+
+            pContext->bFeaturesEnabled = DSL_TRUE;
+         }
+         else /* disable sequence: SOS->ROC */
+         {
+            /* Restore rateAdaptationMode to its default */
+            pContext->rateAdaptationMode[DSL_MODE_VDSL][DSL_UPSTREAM] =
+               DSL_G997_RA_MODE_DYNAMIC;
+            pContext->rateAdaptationMode[DSL_MODE_VDSL][DSL_DOWNSTREAM] =
+               DSL_G997_RA_MODE_DYNAMIC;
+
+            /* Disable ROC */
+            pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_UPSTREAM].bRocEnable =
+               DSL_FEATURE_DISABLED;
+            pContext->lineFeatureDataCfg[DSL_MODE_VDSL][DSL_DOWNSTREAM].bRocEnable =
+               DSL_FEATURE_DISABLED;
+         }
+#endif /* INCLUDE_DSL_CPE_API_VRX */
 
          /* Get Autoboot pending start flag*/
          DSL_CTX_READ(pContext, nErrCode, bAutobootStartPending, bAutobootStartPending);
@@ -1757,6 +2344,14 @@ DSL_Error_t DSL_DRV_AutobootControlSet(
    DSL_uint32_t nOppositeLine;
    DSL_uint32_t nRemotePafAvailable = 0;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_AutobootControlSet(%d)"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext), pData->data.nCommand));
@@ -1862,36 +2457,14 @@ DSL_Error_t DSL_DRV_AutobootControlSet(
                   {
                      nOppositeLine = (DSL_DEV_NUM(pContext) + 1) % DSL_DRV_ENTITIES;
 
-                     /* Check other line state FULL_INIT or SHOWTIME */
-                     if (ifxDevices[nOppositeLine].pContext->bGotFullInit ||
-                         ifxDevices[nOppositeLine].pContext->bGotShowtime)
+                     if (ifxDevices[nOppositeLine].pContext != DSL_NULL)
                      {
-                        /* Check current line PAF support */
-                        nErrCode = DSL_DRV_BND_RemotePafAvailableCheck(pContext, &nRemotePafAvailable);
-                        if (nErrCode < DSL_SUCCESS)
-                        {
-                           DSL_DEBUG( DSL_DBG_ERR, (pContext,
-                              SYS_DBG_ERR"DSL[%02d]: ERROR - PAF check failed!"
-                              DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-
-                           return DSL_ERROR;
-                        }
-
-                        /* If current line support PAF */
-                        if (nRemotePafAvailable)
-                        {
-                           /* If opposite line disabled */
-                           if (ifxDevices[nOppositeLine].pContext->bAutobootDisable)
-                           {
-                              nRemotePafAvailable = 0;
-                           }
-                        }
-
-                        /* If current line support PAF and opposite line not disabled */
-                        if (nRemotePafAvailable)
+                        /* Check other line state FULL_INIT or SHOWTIME */
+                        if (ifxDevices[nOppositeLine].pContext->bGotFullInit ||
+                            ifxDevices[nOppositeLine].pContext->bGotShowtime)
                         {
-                           /* Check opposite line PAF support */
-                           nErrCode = DSL_DRV_BND_RemotePafAvailableCheck(ifxDevices[nOppositeLine].pContext, &nRemotePafAvailable);
+                           /* Check current line PAF support */
+                           nErrCode = DSL_DRV_BND_RemotePafAvailableCheck(pContext, &nRemotePafAvailable);
                            if (nErrCode < DSL_SUCCESS)
                            {
                               DSL_DEBUG( DSL_DBG_ERR, (pContext,
@@ -1900,20 +2473,52 @@ DSL_Error_t DSL_DRV_AutobootControlSet(
 
                               return DSL_ERROR;
                            }
-                        }
 
-                        /* remote PAF disabled (for at least for one line)*/
-                        if (!nRemotePafAvailable)
-                        {
-                           DSL_DRV_MUTEX_LOCK(bndLineLockMutex);
-                           /* If no locked lines => lock current line */
-                           if (nLineLocked == -1)
+                           /* If current line support PAF */
+                           if (nRemotePafAvailable)
+                           {
+                              /* If opposite line disabled */
+                              if (ifxDevices[nOppositeLine].pContext->bAutobootDisable)
+                              {
+                                 nRemotePafAvailable = 0;
+                              }
+                           }
+
+                           /* If current line support PAF and opposite line not disabled */
+                           if (nRemotePafAvailable)
                            {
-                              nLineLocked = DSL_DEV_NUM(pContext);
+                              /* Check opposite line PAF support */
+                              nErrCode = DSL_DRV_BND_RemotePafAvailableCheck(ifxDevices[nOppositeLine].pContext, &nRemotePafAvailable);
+                              if (nErrCode < DSL_SUCCESS)
+                              {
+                                 DSL_DEBUG( DSL_DBG_ERR, (pContext,
+                                    SYS_DBG_ERR"DSL[%02d]: ERROR - PAF check failed!"
+                                    DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+                                 return DSL_ERROR;
+                              }
+                           }
+
+                           /* remote PAF disabled (for at least for one line)*/
+                           if (!nRemotePafAvailable)
+                           {
+                              DSL_DRV_MUTEX_LOCK(bndLineLockMutex);
+                              /* If no locked lines => lock current line */
+                              if (nLineLocked == -1)
+                              {
+                                 nLineLocked = DSL_DEV_NUM(pContext);
+                              }
+                              DSL_DRV_MUTEX_UNLOCK(bndLineLockMutex);
                            }
-                           DSL_DRV_MUTEX_UNLOCK(bndLineLockMutex);
                         }
                      }
+                     else
+                     {
+                        DSL_DEBUG( DSL_DBG_WRN, (pContext,
+                           SYS_DBG_WRN"DSL[%02d]: WARNING - Bonding enabled but "
+                           "opposite line context not initialized!"
+                           DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+                     }
                   }
                }
 
@@ -2069,6 +2674,14 @@ DSL_Error_t DSL_DRV_AutobootConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -2097,6 +2710,14 @@ DSL_Error_t DSL_DRV_AutobootConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -2124,6 +2745,14 @@ DSL_Error_t DSL_DRV_FirmwareDownloadStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -2177,6 +2806,14 @@ DSL_Error_t DSL_DRV_AutobootStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -2284,6 +2921,14 @@ DSL_Error_t DSL_DRV_ResourceUsageStatisticsGet(
    DSL_OpenContext_t *pOpenContext = DSL_NULL;
    DSL_ResourceUsageStatisticsData_t devResourceUsageStatisticsData;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -2535,6 +3180,14 @@ DSL_Error_t DSL_DRV_VersionInformationGet(
    DSL_boolean_t bFirmwareReady = DSL_FALSE;
    DSL_uint32_t verNum = 0;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -2593,6 +3246,14 @@ DSL_Error_t DSL_DRV_LineStateGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_LineStateGet"DSL_DRV_CRLF,
       DSL_DEV_NUM(pContext)));
@@ -2619,7 +3280,21 @@ DSL_Error_t DSL_DRV_LineFeatureConfigSet(
    DSL_IN_OUT DSL_LineFeature_t *pData)
 {
    DSL_boolean_t bReTxEnableDs = DSL_FALSE;
+   DSL_boolean_t bRocEnable = DSL_FALSE;
    DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
+   DSL_G997_RA_MODE_t raMode = DSL_G997_RA_MODE_AT_INIT;
+#if defined (DSL_VRX_DEVICE_VR11)
+   DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+   ACK_VDSL_FeatureMapGet_t nFeatureMapGetAck = { 0 };
+#endif
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
 
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_LineFeatureConfigSet"
@@ -2679,6 +3354,142 @@ DSL_Error_t DSL_DRV_LineFeatureConfigSet(
       }
    }
 
+   if (pData->data.bRocEnable != DSL_FEATURE_NA)
+   {
+      if (pData->nDslMode == DSL_MODE_VDSL)
+      {
+         if (pData->data.bRocEnable == DSL_FEATURE_ENABLED)
+         {
+            /* ReTx has to be enabled */
+            if (pData->data.bReTxEnable == DSL_TRUE)
+            {
+               /* enable only if disabled */
+               if (pContext->
+                  lineFeatureDataCfg[pData->nDslMode][pData->nDirection].bRocEnable ==
+                  DSL_FEATURE_DISABLED)
+               {
+#if defined (DSL_VRX_DEVICE_VR11)
+                  /* minimum FW version for ROC is R6 */
+                  nErrCode = DSL_DRV_VRX_FirmwareVersionCheck(pContext,
+                     DSL_MIN_FW_VERSION_VR11_R6, &nVerCheck);
+                  if (nErrCode == DSL_SUCCESS)
+                  {
+                     if (nVerCheck >= DSL_VERSION_EQUAL)
+                     {
+                        /* related FeatureMap bit WOF15 has to be enabled */
+                        nErrCode = DSL_DRV_VRX_SendMsgFeatureMapGet(pContext,
+                           (DSL_uint8_t *)&nFeatureMapGetAck);
+                        if (nErrCode == DSL_SUCCESS)
+                        {
+
+                           if (nFeatureMapGetAck.W0F15 == VRX_ENABLE)
+                           {
+                              bRocEnable = DSL_TRUE;
+                           }
+                        }
+                        else
+                        {
+                           DSL_DEBUG(DSL_DBG_ERR,
+                              (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - "
+                                 "FeatureMap get failed!" DSL_DRV_CRLF,
+                                 DSL_DEV_NUM(pContext)));
+
+                           nRet = DSL_WRN_CONFIG_PARAM_IGNORED;
+                        }
+                     }
+                     else
+                     {
+                        DSL_DEBUG(DSL_DBG_WRN,
+                           (pContext, SYS_DBG_WRN"DSL[%02d]: minimum FW version R6 "
+                              "is required for requested configuration." DSL_DRV_CRLF,
+                              DSL_DEV_NUM(pContext)));
+
+                        nRet = DSL_WRN_CONFIG_PARAM_IGNORED;
+                     }
+                  }
+                  else
+                  {
+                     DSL_DEBUG(DSL_DBG_ERR,
+                        (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FW version check failed!"
+                           DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+                     nRet = DSL_WRN_CONFIG_PARAM_IGNORED;
+                  }
+#else
+                  nRet = DSL_WRN_CONFIG_PARAM_IGNORED;
+#endif /* defined (DSL_VRX_DEVICE_VR11) */
+               }
+               else
+               {
+                  /* do not disable */
+                  bRocEnable = DSL_TRUE;
+               }
+            }
+            else
+            {
+               /* if ROC already enabled, ReTx cannot be disabled
+                  (required disable sequence: ROC -> ReTx) */
+               if (pContext->
+                  lineFeatureDataCfg[pData->nDslMode][pData->nDirection].bRocEnable ==
+                  DSL_FEATURE_ENABLED)
+               {
+                  DSL_DEBUG(DSL_DBG_WRN,
+                     (pContext, SYS_DBG_WRN"DSL[%02d]: insufficient dependency - "
+                     "Roc depends on ReTx." DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+                  pData->data.bReTxEnable = DSL_TRUE;
+                  bRocEnable = DSL_TRUE;
+               }
+               else
+               {
+                  DSL_DEBUG(DSL_DBG_WRN,
+                     (pContext, SYS_DBG_WRN"DSL[%02d]: ReTx is required for "
+                     "requested configuration." DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+               }
+
+               nRet = DSL_WRN_CONFIG_ONLY_SUPPORTED_WITH_RTX_ENABLED;
+            }
+         }
+
+         /* disable ROC */
+         if (bRocEnable == DSL_FALSE)
+         {
+            /* Disable only if SOS is not enabled
+               (required disable sequence: SOS -> ROC) */
+            DSL_CTX_READ(pContext, nErrCode,
+               rateAdaptationMode[pData->nDslMode][pData->nDirection],
+               raMode);
+            if (raMode != DSL_G997_RA_MODE_DYNAMIC_SOS)
+            {
+               pData->data.bRocEnable = DSL_FEATURE_DISABLED;
+            }
+            else
+            {
+               DSL_DEBUG(DSL_DBG_WRN,
+                  (pContext, SYS_DBG_WRN"DSL[%02d]: insufficient dependency - "
+                  "rate adaptation config depends on Roc (and Roc on ReTx)."
+                  DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+               /* if ReTx was to be disabled, it has to stay enabled */
+               pData->data.bReTxEnable = DSL_TRUE;
+               pData->data.bRocEnable = DSL_FEATURE_ENABLED;
+
+               nRet = DSL_WRN_CONFIG_PARAM_IGNORED;
+            }
+         }
+      }
+      else
+      {
+         pData->data.bRocEnable = DSL_FEATURE_DISABLED;
+         nRet = DSL_WRN_CONFIG_PARAM_IGNORED;
+      }
+   }
+   else
+   {
+      DSL_CTX_READ_SCALAR(pContext, nErrCode,
+         lineFeatureDataCfg[pData->nDslMode][pData->nDirection].bRocEnable,
+         pData->data.bRocEnable);
+   }
+
    DSL_CTX_WRITE(pContext, nErrCode,
       lineFeatureDataCfg[pData->nDslMode][pData->nDirection], pData->data);
 
@@ -2700,6 +3511,14 @@ DSL_Error_t DSL_DRV_LineFeatureConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_LineFeatureConfigGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -2736,6 +3555,14 @@ DSL_Error_t DSL_DRV_LineFeatureStatusGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_LineStateValue_t nCurrentState = DSL_LINESTATE_UNKNOWN;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_LineFeatureStatusGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -2780,6 +3607,14 @@ DSL_Error_t DSL_DRV_InteropFeatureConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_InteropFeatureConfigSet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -2818,6 +3653,14 @@ DSL_Error_t DSL_DRV_InteropFeatureConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_InteropFeatureConfigGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -2846,6 +3689,14 @@ DSL_Error_t DSL_DRV_LoopLengthStatusGet(
    DSL_Error_t nLoopLengthErrCode = DSL_SUCCESS;
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -2915,6 +3766,14 @@ DSL_Error_t DSL_DRV_RetxStatisticsGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
    DSL_CHECK_DIRECTION(pData->nDirection);
@@ -3023,6 +3882,15 @@ DSL_Error_t DSL_DRV_SystemInterfaceConfigSet(
    DSL_SystemInterfaceConfig_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS, nRetCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3062,6 +3930,15 @@ DSL_Error_t DSL_DRV_SystemInterfaceConfigGet(
    DSL_SystemInterfaceConfig_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3093,6 +3970,15 @@ DSL_Error_t DSL_DRV_SystemInterfaceStatusGet(
    DSL_SystemInterfaceStatus_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3239,6 +4125,15 @@ DSL_Error_t DSL_DRV_BandBorderStatusGet(
    DSL_BandBorderStatus_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
    DSL_CHECK_DIRECTION(pData->nDirection);
@@ -3267,6 +4162,15 @@ DSL_Error_t DSL_DRV_MiscLineStatusGet(
    DSL_MiscLineStatus_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3297,6 +4201,15 @@ DSL_Error_t DSL_DRV_LineOptionsConfigSet(
 #ifdef INCLUDE_DSL_CPE_API_DANUBE
    DSL_boolean_t bTrustMeBit;
 #endif /* INCLUDE_DSL_CPE_API_DANUBE*/
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3390,6 +4303,15 @@ DSL_Error_t DSL_DRV_LineOptionsConfigGet(
    DSL_LineOptionsConfig_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3442,6 +4364,15 @@ DSL_Error_t DSL_LastExceptionCodesGet(
    DSL_LastExceptionCodes_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3469,6 +4400,15 @@ DSL_Error_t DSL_DRV_LowLevelConfigurationSet(
    DSL_LowLevelConfiguration_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3501,6 +4441,15 @@ DSL_Error_t DSL_DRV_LowLevelConfigurationGet(
    DSL_LowLevelConfiguration_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3529,6 +4478,15 @@ DSL_Error_t DSL_DRV_AuxLineInventoryGet(
    DSL_AuxLineInventory_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
    DSL_CHECK_ATU_DIRECTION(pData->nDirection);
@@ -3559,6 +4517,14 @@ DSL_Error_t DSL_DRV_BandPlanStatusGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_LineStateValue_t nCurrentState = DSL_LINESTATE_UNKNOWN;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3599,6 +4565,15 @@ DSL_Error_t DSL_DRV_BandPlanSupportedGet(
    DSL_BandPlanSupport_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3626,6 +4601,14 @@ DSL_Error_t DSL_DRV_VdslProfileConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3653,6 +4636,14 @@ DSL_Error_t DSL_DRV_VdslProfileConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3685,6 +4676,14 @@ DSL_Error_t DSL_DRV_EventStatusMaskConfigSet(
    DSL_uint32_t nEventMask;
    DSL_boolean_t bFwEv = DSL_FALSE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3814,6 +4813,14 @@ DSL_Error_t DSL_DRV_EventStatusMaskConfigGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_uint32_t nEventMask;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3892,6 +4899,14 @@ DSL_Error_t DSL_DRV_FramingParameterStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3923,6 +4938,14 @@ DSL_Error_t DSL_DRV_PilotTonesStatusGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_LineStateValue_t nCurrentState = DSL_LINESTATE_UNKNOWN;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -3967,6 +4990,14 @@ DSL_Error_t DSL_DRV_RebootCriteriaConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS, nRet = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4006,6 +5037,14 @@ DSL_Error_t DSL_DRV_RebootCriteriaConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4044,6 +5083,14 @@ DSL_Error_t DSL_DRV_DBG_ModuleLevelSet(
    IOCTL_MEI_dbgLevel_t fioVrxDrvDbgLevelSet;
 #endif /* INCLUDE_DSL_CPE_API_VRX */
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4251,6 +5298,14 @@ DSL_Error_t DSL_DRV_DBG_ModuleLevelGet(
    DSL_debugLevelEntry_t *pDbgLvlNames = DSL_NULL;
    DSL_int_t i = 0;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4318,6 +5373,14 @@ DSL_Error_t DSL_DRV_DBG_ModuleDestinationSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4343,6 +5406,14 @@ DSL_Error_t DSL_DRV_DBG_ModuleDestinationGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4386,6 +5457,15 @@ DSL_Error_t DSL_DRV_DBG_DebugFeatureConfigSet(
    DSL_IN DSL_DBG_DebugFeatureConfig_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4402,6 +5482,15 @@ DSL_Error_t DSL_DRV_DBG_DebugFeatureConfigGet(
    DSL_IN DSL_DBG_DebugFeatureConfig_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4422,6 +5511,15 @@ DSL_Error_t DSL_DRV_FilterDetectionDataGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_boolean_t bFilterDetectionCompleted = DSL_FALSE;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4472,6 +5570,14 @@ DSL_Error_t DSL_DRV_HybridSelectionDataGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4526,6 +5632,14 @@ DSL_Error_t DSL_DRV_OlrStatisticsGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
    DSL_CHECK_DIRECTION(pData->nDirection);
@@ -4740,6 +5854,14 @@ DSL_Error_t DSL_DRV_RTT_Init(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_boolean_t bRttEnabled = DSL_FALSE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4777,6 +5899,14 @@ DSL_Error_t DSL_DRV_RTT_ConfigSet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_boolean_t bRttEnabled = DSL_FALSE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4814,6 +5944,14 @@ DSL_Error_t DSL_DRV_RTT_ConfigGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_boolean_t bRttEnabled = DSL_FALSE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4850,6 +5988,14 @@ DSL_Error_t DSL_DRV_RTT_StatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4881,6 +6027,14 @@ DSL_Error_t DSL_DRV_RTT_ControlSet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_boolean_t bRttEnabled = DSL_FALSE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4918,6 +6072,14 @@ DSL_Error_t DSL_DRV_RTT_StatisticsGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_boolean_t bRttEnabled = DSL_FALSE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -4953,6 +6115,14 @@ DSL_Error_t DSL_DRV_T1413_XTUO_RevisionStatusGet(
    DSL_uint8_t XTSE1 = 0;
    DSL_LineStateValue_t nCurrentState = DSL_LINESTATE_UNKNOWN;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -5032,6 +6202,14 @@ DSL_Error_t DSL_DRV_T1413_XTUR_RevisionStatusGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_uint8_t XTSE1 = 0;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -5081,6 +6259,14 @@ DSL_Error_t DSL_DRV_T1413_XTUO_VendorRevisionStatusGet(
    DSL_uint8_t XTSE1 = 0;
    DSL_LineStateValue_t nCurrentState = DSL_LINESTATE_UNKNOWN;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -5160,6 +6346,14 @@ DSL_Error_t DSL_DRV_T1413_XTUR_VendorRevisionStatusGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_uint8_t XTSE1 = 0;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -5206,6 +6400,15 @@ DSL_Error_t DSL_DRV_PSDCalibrationConfigGet(
    DSL_IN_OUT DSL_PSDCalibration_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
    DSL_CHECK_DIRECTION(pData->nDirection);
@@ -5233,6 +6436,14 @@ DSL_Error_t DSL_DRV_PSDCalibrationConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -5270,7 +6481,6 @@ DSL_IOCTL_REGISTER(DSL_FIO_AUTOBOOT_STATUS_GET, DSL_IOCTL_HELPER_GET,
 DSL_IOCTL_REGISTER(DSL_FIO_LINE_STATE_GET, DSL_IOCTL_HELPER_GET,
                    DSL_FALSE, DSL_DRV_LineStateGet,
                    sizeof(DSL_LineState_t)),
-
 /* DSL_FIO_AUTOBOOT_CONFIG_SET */
 DSL_IOCTL_REGISTER(DSL_FIO_AUTOBOOT_CONFIG_SET, DSL_IOCTL_HELPER_SET,
                    DSL_FALSE, DSL_DRV_AutobootConfigSet,
@@ -6197,6 +7407,12 @@ DSL_IOCTL_REGISTER(DSL_FIO_PSD_CALIBRATION_CONFIG_GET, DSL_IOCTL_HELPER_GET,
 DSL_IOCTL_REGISTER(DSL_FIO_PSD_CALIBRATION_CONFIG_SET, DSL_IOCTL_HELPER_SET,
                    DSL_FALSE, DSL_DRV_PSDCalibrationConfigSet,
                    sizeof(DSL_PSDCalibration_t)),
+DSL_IOCTL_REGISTER(DSL_FIO_OPERATOR_CONFIG_GET, DSL_IOCTL_HELPER_GET,
+                   DSL_FALSE, DSL_DRV_OperatorSelectConfigGet,
+                   sizeof(DSL_OperatorConfig_t)),
+DSL_IOCTL_REGISTER(DSL_FIO_OPERATOR_CONFIG_SET, DSL_IOCTL_HELPER_SET,
+                   DSL_FALSE, DSL_DRV_OperatorSelectConfigSet,
+                   sizeof(DSL_OperatorConfig_t)),
 
 /* IOCTL: Dummy delimeter */
 DSL_IOCTL_REGISTER(0, DSL_IOCTL_HELPER_UNKNOWN, DSL_FALSE, DSL_NULL, 0)
@@ -6260,22 +7476,16 @@ DSL_Error_t DSL_DRV_IoctlHandle(
    DSL_uint32_t nArg)
 {
    DSL_Error_t nErrCode = DSL_ERROR;
-   DSL_Error_t nCtxRWErrCode = DSL_ERROR;
    DSL_IOCTL_arg_t *pIOCTL_arg = DSL_NULL;
    DSL_EventData_Union_t *pEventData;
    DSL_uint8_t *pMsgBuf, *pOldMsgBuf, *pMaskBuf, *pDataBuf;
    DSL_uint16_t *pMsgId;
    DSL_uint16_t i;
-   DSL_boolean_t bEventActivation = DSL_FALSE, bFwEventActivation;
-   DSL_BF_ResourceActivationType_t nResourceActivationMask;
-   DSL_EventStatusData_t event;
    DSL_IOCTL_Table_t *pIoctlTable = ioctlTable, *pIoctlRecord = ioctlTable ;
    DSL_boolean_t bIoctlFound = DSL_FALSE;
-   DSL_DEV_Handle_t dev;
 #if defined (DSL_VRX_DEVICE_VR11)
-   DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+   DSL_boolean_t bPowerDownInaccessibleFW = DSL_FALSE;
 #endif
-   DSL_uint32_t nOppositeLine;
 
 #ifndef DSL_DEBUG_DISABLE
    DSL_DEBUG(DSL_DBG_MSG,
@@ -6284,6 +7494,36 @@ DSL_Error_t DSL_DRV_IoctlHandle(
       nCommand, DSL_DBG_IoctlName(nCommand)));
 #endif /* DSL_DEBUG_DISABLE*/
 
+#if defined (DSL_VRX_DEVICE_VR11)
+   DSL_CTX_READ_SCALAR(pContext, nErrCode, bPowerDownInaccessibleFW, bPowerDownInaccessibleFW);
+
+   if (bPowerDownInaccessibleFW == DSL_TRUE)
+   {
+      /* Handle VRX IOctl white list*/
+      i = 0;
+      while (g_VRxPD_IOctlWhitelist[i] != 0xFFFFFFFF)
+      {
+         if (nCommand == g_VRxPD_IOctlWhitelist[i])
+            break;
+         ++i;
+      }
+
+      if (g_VRxPD_IOctlWhitelist[i] == 0xFFFFFFFF)
+      {
+         nErrCode = DSL_ERR_NOT_SUPPORTED_IN_CURRENT_AUTOBOOT_STATE;
+         DSL_IoctlMemCpyTo( bIsInKernel, (DSL_void_t*)nArg, &nErrCode,
+            sizeof(DSL_Error_t));
+
+         DSL_DEBUG(DSL_DBG_WRN,
+            (pContext, SYS_DBG_WRN"DSL[%02d]: Unsupported in PD mode IOctl=0x%08X (%s)!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext), nCommand, DSL_DBG_IoctlName(nCommand)));
+
+         return nErrCode;
+      }
+   }
+#endif
+
+   /* VRx message white list handling END*/
    switch (nCommand)
    {
       case DSL_FIO_INIT:
@@ -6712,270 +7952,7 @@ DSL_Error_t DSL_DRV_IoctlHandle(
             DSL_IoctlMemCpyFrom(bIsInKernel, pIOCTL_arg, (DSL_void_t*)nArg,
                sizeof(DSL_InstanceControl_t));
 
-            nErrCode = DSL_SUCCESS;
-
-            /* Lock Open Context list*/
-            if (DSL_DRV_MUTEX_LOCK(pContext->pDevCtx->openContextListMutex))
-            {
-               DSL_DEBUG( DSL_DBG_ERR,
-                  (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: ERROR - Couldn't lock Context List mutex!"
-                  DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-
-               nErrCode = DSL_ERR_SEMAPHORE_GET;
-               break;
-            }
-
-            /*
-               Proceed Event Activation Control settings
-            */
-            if(DSL_DRV_MUTEX_LOCK(pOpenCtx->eventMutex))
-            {
-               DSL_DEBUG( DSL_DBG_ERR,
-                  (pContext, SYS_DBG_ERR"DSL[%02d]: Couldn't lock event mutex"
-                  DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-               nErrCode = DSL_ERROR;
-            }
-            else
-            {
-               /* Get bEventActivation flag*/
-               bEventActivation = (((DSL_InstanceControl_t*)pIOCTL_arg)->data.bEventActivation);
-               /* Get nResourceActivationMask data*/
-               nResourceActivationMask = (((DSL_InstanceControl_t*)pIOCTL_arg)->data.nResourceActivationMask);
-               bFwEventActivation = (((DSL_InstanceControl_t*)pIOCTL_arg)->data.bFwEventActivation);
-
-               if (bEventActivation == DSL_FALSE)
-               {
-                  DSL_DRV_MUTEX_UNLOCK(pOpenCtx->eventMutex);
-                  /** free event structures */
-                  if (pOpenCtx->eventFifo != DSL_NULL && pOpenCtx->eventFifoBuf != DSL_NULL)
-                  {
-                     while (!DSL_Fifo_isEmpty(pOpenCtx->eventFifo))
-                     {
-                        if (DSL_DRV_EventUnqueue(pOpenCtx, &event) >= DSL_SUCCESS)
-                        {
-                           if (event.pData != DSL_NULL)
-                           {
-                              DSL_DRV_VFree(event.pData);
-                           }
-                        }
-                     }
-                  }
-
-                  if(DSL_DRV_MUTEX_LOCK(pOpenCtx->eventMutex))
-                  {
-                     DSL_DEBUG( DSL_DBG_ERR,
-                        (pContext, SYS_DBG_ERR"DSL[%02d]: Couldn't lock event mutex"
-                        DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-                     nErrCode = DSL_ERROR;
-                  }
-                  else
-                  {
-                     /* release event structures */
-                     if (pOpenCtx->eventFifo != DSL_NULL)
-                     {
-                        DSL_DRV_VFree(pOpenCtx->eventFifo);
-                        pOpenCtx->eventFifo = DSL_NULL;
-                     }
-
-                     /* release event structures */
-                     if (pOpenCtx->eventFifoBuf != DSL_NULL)
-                     {
-                        DSL_DRV_VFree(pOpenCtx->eventFifoBuf);
-                        pOpenCtx->eventFifoBuf = DSL_NULL;
-                     }
-                  }
-               }
-               else
-               {
-                  /* initialize event structures */
-                  pOpenCtx->eventFifo = DSL_DRV_VMalloc(sizeof(DSL_FIFO));
-                  if (pOpenCtx->eventFifo == DSL_NULL)
-                  {
-                     DSL_DEBUG(DSL_DBG_ERR,
-                        (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Open failed, "
-                        "could not allocate memory for event FIFO..."DSL_DRV_CRLF,
-                        DSL_DEV_NUM(pContext)));
-                     nErrCode = DSL_ERR_MEMORY;
-                  }
-                  else
-                  {
-                     pOpenCtx->eventFifoBuf = DSL_DRV_VMalloc(DSL_EVENT_FIFO_ELEMENT_COUNT
-                        * sizeof(DSL_EventStatusData_t));
-                     if (pOpenCtx->eventFifoBuf == DSL_NULL)
-                     {
-                        DSL_DEBUG(DSL_DBG_ERR,
-                           (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Open failed, "
-                           "could not allocate memory for event FIFO..."DSL_DRV_CRLF,
-                           DSL_DEV_NUM(pContext)));
-                        DSL_DRV_VFree(pOpenCtx->eventFifo);
-                        nErrCode = DSL_ERR_MEMORY;
-                     }
-                     else
-                     {
-                        /* init event fifo */
-                        if (DSL_Fifo_Init(pOpenCtx->eventFifo,
-                           pOpenCtx->eventFifoBuf,
-                           pOpenCtx->eventFifoBuf +
-                             (DSL_EVENT_FIFO_ELEMENT_COUNT - 1) *
-                             sizeof(DSL_EventStatusData_t),
-                           sizeof(DSL_EventStatusData_t)) != 0)
-                        {
-                           DSL_DEBUG(DSL_DBG_ERR,
-                              (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Internal error in the DSL "
-                              "CPE API. Could not prepare FIFO for the events."DSL_DRV_CRLF,
-                              DSL_DEV_NUM(pContext)));
-                           DSL_DRV_VFree(pOpenCtx->eventFifoBuf);
-                           DSL_DRV_VFree(pOpenCtx->eventFifo);
-                           nErrCode = DSL_ERR_INTERNAL;
-                        }
-                     }
-                  }
-               }
-
-               pOpenCtx->bEventActivation = bEventActivation;
-               pOpenCtx->nResourceActivationMask = nResourceActivationMask;
-
-               #if defined (DSL_VRX_DEVICE_VR11)
-               DSL_DRV_VRX_FirmwareVersionCheck(pContext, DSL_MIN_FW_VERSION_VR11_R5, &nVerCheck);
-               if (bFwEventActivation && nVerCheck >= DSL_VERSION_EQUAL)
-               {
-                  DSL_CTX_WRITE_SCALAR(pContext, nCtxRWErrCode, bFwEventActivation, DSL_TRUE);
-                  DSL_SET_ERROR_CODE(nCtxRWErrCode, nErrCode);
-               }
-               else
-               {
-                  DSL_SET_ERROR_CODE(DSL_WRN_CONFIG_PARAM_IGNORED, nErrCode);
-                  DSL_CTX_WRITE_SCALAR(pContext, nCtxRWErrCode, bFwEventActivation, DSL_FALSE);
-                  DSL_SET_ERROR_CODE(nCtxRWErrCode, nErrCode);
-               }
-               #else
-               DSL_SET_ERROR_CODE(DSL_WRN_CONFIG_PARAM_IGNORED, nErrCode);
-               DSL_CTX_WRITE_SCALAR(pContext, nCtxRWErrCode, bFwEventActivation, DSL_FALSE);
-               DSL_SET_ERROR_CODE(nCtxRWErrCode, nErrCode);
-               #endif /* defined (DSL_VRX_DEVICE_VR11) */
-
-               DSL_CTX_READ_SCALAR(pContext, nCtxRWErrCode, bFwEventActivation, bFwEventActivation);
-               DSL_SET_ERROR_CODE(nCtxRWErrCode, nErrCode);
-
-               dev = pContext->pDevCtx->nfc_lowHandle;
-
-               if (bFwEventActivation)
-               {
-                  if(DSL_DRV_VRX_InternalNfcCallBackDataSet((MEI_DYN_CNTRL_T*)dev,
-                                                   (void *)DSL_DRV_AutobootSignalDeviceEvt,
-                                                   (void *)pContext) < 0)
-                  {
-                     DSL_DEBUG( DSL_DBG_ERR, (pContext,
-                        SYS_DBG_ERR"DSL[%02d]: ERROR - VRx NFC set callback failed!"
-                        DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-                  }
-               }
-               else
-               {
-                  if(DSL_DRV_VRX_InternalNfcCallBackDataSet((MEI_DYN_CNTRL_T*)dev,
-                                                            DSL_NULL,
-                                                            DSL_NULL) < 0)
-                  {
-                     DSL_DEBUG( DSL_DBG_ERR, (pContext,
-                        SYS_DBG_ERR"DSL[%02d]: ERROR - VRx NFC clear callback failed!"
-                        DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-
-                     nErrCode = DSL_ERROR;
-                  }
-               }
-               /* Try to send but do not forward error in case of very early cli ics execute */
-               DSL_DRV_VRX_SendMsgModemFSMEventConfigure(pContext, bFwEventActivation);
-
-               if (DSL_DRV_BONDING_ENABLED && DSL_DRV_LINES_PER_DEVICE == 1)
-               {
-                  nOppositeLine = (DSL_DEV_NUM(pContext) + 1) % DSL_DRV_ENTITIES;
-
-                  ifxDevices[nOppositeLine].pContext->bFwEventActivation = bFwEventActivation;
-               }
-
-               DSL_DRV_MUTEX_UNLOCK(pOpenCtx->eventMutex);
-            }
-
-            /*
-               Proceed Resource activation settings
-            */
-#ifdef INCLUDE_DSL_CEOC
-            if(DSL_DRV_MUTEX_LOCK(pOpenCtx->rxSnmpFifoMutex))
-            {
-               DSL_DEBUG( DSL_DBG_ERR,
-                  (pContext, SYS_DBG_ERR"DSL[%02d]: Couldn't lock Rx SNMP FIFO mutex"
-                  DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-               nErrCode = DSL_ERR_SEMAPHORE_GET;
-            }
-            else
-            {
-               if (nResourceActivationMask & DSL_RESOURCE_ACTIVATION_SNMP)
-               {
-                  /* release event structures */
-                  if (pOpenCtx->rxSnmpFifo != DSL_NULL)
-                  {
-                     DSL_DRV_VFree(pOpenCtx->rxSnmpFifo);
-                     pOpenCtx->rxSnmpFifo = DSL_NULL;
-                  }
-
-                  /* release event structures */
-                  if (pOpenCtx->rxSnmpFifoBuf != DSL_NULL)
-                  {
-                     DSL_DRV_VFree(pOpenCtx->rxSnmpFifoBuf);
-                     pOpenCtx->rxSnmpFifoBuf = DSL_NULL;
-                  }
-               }
-               else
-               {
-                  /* initialize event structures */
-                  pOpenCtx->rxSnmpFifo = DSL_DRV_VMalloc(sizeof(DSL_FIFO));
-                  if (pOpenCtx->rxSnmpFifo == DSL_NULL)
-                  {
-                     DSL_DEBUG(DSL_DBG_ERR,
-                        (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Could not allocate memory for SNMP FIFO!!!"
-                        DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-                     nErrCode = DSL_ERR_MEMORY;
-                  }
-                  else
-                  {
-                     pOpenCtx->rxSnmpFifoBuf =
-                        DSL_DRV_VMalloc(DSL_CEOC_RX_FIFO_ELEMENT_COUNT * sizeof(DSL_G997_SnmpData_t));
-                     if (pOpenCtx->rxSnmpFifoBuf == DSL_NULL)
-                     {
-                        DSL_DEBUG(DSL_DBG_ERR,
-                           (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Could not allocate memory for SNMP FIFO buffer!!!"
-                           DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-                        DSL_DRV_VFree(pOpenCtx->rxSnmpFifo);
-                        nErrCode = DSL_ERR_MEMORY;
-                     }
-                     else
-                     {
-                        /* init event fifo */
-                        if (DSL_Fifo_Init(
-                               pOpenCtx->rxSnmpFifo,
-                               pOpenCtx->rxSnmpFifoBuf,
-                               pOpenCtx->rxSnmpFifoBuf +
-                               sizeof(DSL_CEOC_Message_t)*(DSL_CEOC_RX_FIFO_ELEMENT_COUNT - 1),
-                               sizeof(DSL_CEOC_Message_t)) != 0)
-                        {
-                           DSL_DEBUG(DSL_DBG_ERR,
-                              (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: Internal error in the DSL "
-                              "CPE API. Could not prepare FIFO for the events."DSL_DRV_CRLF,
-                              DSL_DEV_NUM(pContext)));
-                           DSL_DRV_VFree(pOpenCtx->rxSnmpFifoBuf);
-                           DSL_DRV_VFree(pOpenCtx->rxSnmpFifo);
-                           nErrCode = DSL_ERR_INTERNAL;
-                        }
-                     }
-                  }
-               }
-               pOpenCtx->nResourceActivationMask = nResourceActivationMask;
-               DSL_DRV_MUTEX_UNLOCK(pOpenCtx->rxSnmpFifoMutex);
-            }
-#endif /* #ifdef INCLUDE_DSL_CEOC*/
-
-            /* Unlock Open Context list*/
-            DSL_DRV_MUTEX_UNLOCK(pContext->pDevCtx->openContextListMutex);
+            nErrCode = DSL_DRV_InstanceControlSet(pOpenCtx, pContext, (DSL_InstanceControl_t *)pIOCTL_arg);
 
             DSL_IoctlMemCpyTo( bIsInKernel, (DSL_void_t*)nArg, &nErrCode,
                sizeof(DSL_Error_t));
@@ -7044,6 +8021,14 @@ DSL_Error_t DSL_DRV_TestModeControlSet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_TestModeControlSet_t nTestModeControl = DSL_TESTMODE_DISABLE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_TestModeControlSet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -7096,6 +8081,14 @@ DSL_Error_t DSL_DRV_TestModeStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_TestModeStatusGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -8040,6 +9033,14 @@ DSL_Error_t DSL_DRV_DeltSNRGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -8063,6 +9064,86 @@ DSL_Error_t DSL_DRV_DeltSNRGet(
 }
 #endif /* INCLUDE_DSL_DELT */
 
+/*
+   For a detailed description of the function, its arguments and return value
+   please refer to the description in the header file 'drv_dsl_cpe_intern.h'
+*/
+DSL_Error_t DSL_DRV_OperatorSelectConfigGet(
+   DSL_IN DSL_Context_t *pContext,
+   DSL_IN_OUT DSL_OperatorConfig_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
+   DSL_DEBUG(DSL_DBG_MSG,
+      (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_OperatorSelectConfigGet"DSL_DRV_CRLF,
+      DSL_DEV_NUM(pContext)));
+
+   DSL_CHECK_POINTER(pContext, pData);
+   DSL_CHECK_ERR_CODE();
+
+   DSL_CTX_READ_SCALAR(pContext, nErrCode, nDslOperator, pData->data.nDslOperator);
+
+   DSL_DEBUG(DSL_DBG_MSG,
+      (pContext, SYS_DBG_MSG"DSL[%02d]: OUT - DSL_DRV_OperatorSelectConfigGet,"
+      " nDslOperator=%hu, retCode=%d"DSL_DRV_CRLF, DSL_DEV_NUM(pContext),
+      pData->data.nDslOperator, nErrCode));
+
+   return nErrCode;
+}
+
+/*
+   For a detailed description of the function, its arguments and return value
+   please refer to the description in the header file 'drv_dsl_cpe_intern.h'
+*/
+DSL_Error_t DSL_DRV_OperatorSelectConfigSet(
+   DSL_IN DSL_Context_t *pContext,
+   DSL_IN_OUT DSL_OperatorConfig_t *pData)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   const DSL_uint16_t nMaxDslOperatorValue = 255;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
+   DSL_DEBUG(DSL_DBG_MSG,
+      (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_OperatorSelectConfigSet"DSL_DRV_CRLF,
+      DSL_DEV_NUM(pContext)));
+
+   DSL_CHECK_POINTER(pContext, pData);
+   DSL_CHECK_ERR_CODE();
+
+   if (pData->data.nDslOperator > nMaxDslOperatorValue)
+   {
+      nErrCode = DSL_ERROR;
+
+      DSL_DEBUG(DSL_DBG_ERR,
+         (pContext, SYS_DBG_ERR"ERROR - DSL_DRV_OperatorSelectConfigSet: "
+         "Exceeded max possible value <%hu>!"DSL_DRV_CRLF, nMaxDslOperatorValue));
+   }
+   else
+      DSL_CTX_WRITE_SCALAR(pContext, nErrCode, nDslOperator, (DSL_uint8_t)(pData->data.nDslOperator));
+
+   DSL_DEBUG(DSL_DBG_MSG,
+      (pContext, SYS_DBG_MSG"DSL[%02d]: OUT - DSL_DRV_OperatorSelectConfigSet,"
+      " nDslOperator=%hhu, retCode=%d"DSL_DRV_CRLF, DSL_DEV_NUM(pContext),
+      (DSL_uint8_t)(pData->data.nDslOperator), nErrCode));
+
+   return nErrCode;
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/common/drv_dsl_cpe_autoboot.c b/src/common/drv_dsl_cpe_autoboot.c
index 4c89633cfefdc974cf0d0824ac00ef466c17fa61..60bb6f225539e57786885da43accc8bc4a3eeb0e 100644
--- a/src/common/drv_dsl_cpe_autoboot.c
+++ b/src/common/drv_dsl_cpe_autoboot.c
@@ -74,7 +74,6 @@ DSL_Error_t DSL_DRV_AutobootSignalDeviceEvt(
    if(pContext && pContext->bFwEventActivation)
    {
       pContext->bFwEventRcvd = DSL_TRUE;
-      DSL_DRV_WAKEUP_EVENT(pContext->autobootEvent);
    }
    else
    {
@@ -1131,7 +1130,7 @@ static DSL_Error_t DSL_DRV_AutobootHandleOrderlyShutdownWait(
 
    DSL_DEBUG(DSL_DBG_MSG, (pContext, SYS_DBG_MSG
       "DSL[%02d]: OUT - DSL_DRV_AutobootHandleOrderlyShutdownWait, retCode=%d"
-      DSL_DRV_CRLF, nErrCode, DSL_DEV_NUM(pContext)));
+      DSL_DRV_CRLF, DSL_DEV_NUM(pContext), nErrCode));
 
    return nErrCode;
 }
diff --git a/src/common/drv_dsl_cpe_debug.c b/src/common/drv_dsl_cpe_debug.c
index e1d934ccca636fba12b582a99c352aa11ec31836..ebc5432c74ba093149a594a56601e0c818d8c352 100644
--- a/src/common/drv_dsl_cpe_debug.c
+++ b/src/common/drv_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.
diff --git a/src/common/drv_dsl_cpe_os_linux.c b/src/common/drv_dsl_cpe_os_linux.c
index c73b197b158f839234a1de692b26beccf945ee21..bf33f17ef5122c694bd92f486195bc58d783df0a 100644
--- a/src/common/drv_dsl_cpe_os_linux.c
+++ b/src/common/drv_dsl_cpe_os_linux.c
@@ -1,7 +1,7 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+           Copyright (c) 2018      Intel Corporation
+           Copyright (c) 2007-2015 Lantiq Beteiligungs-GmbH & Co. KG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -20,6 +20,7 @@
 #include "drv_dsl_cpe_debug.h"
 
 #include <linux/device.h>
+#include <linux/cdev.h>
 
 #include "drv_mei_cpe_api_intern.h" /* MEI_InternalDevLayout */
 
@@ -93,6 +94,7 @@ DSL_uint8_t g_MaxEntieties = 1;
 /* the major number of this driver */
 static int nMajorNum = DRV_DSL_CPE_API_DEV_MAJOR;
 static struct class *dsl_class;
+static struct cdev *p_dsl_api_cdevs[DSL_DRV_MAX_SUPPORTED_ENTITIES];
 
 #ifndef _lint
 static struct file_operations dslCpeApiOperations = {
@@ -371,11 +373,17 @@ static DSL_uint_t DSL_DRV_Poll(DSL_DRV_file_t *pFile, DSL_DRV_Poll_Table_t *wait
 
 static int DSL_DRV_DevNodeInit(DSL_void_t)
 {
+   int result;
    DSL_int_t i;
    static dev_t dsl_devt;
+   struct device *tmp_dev = NULL;
 
-   if (register_chrdev(nMajorNum, DRV_DSL_CPE_API_DEV_NAME,
-                        &dslCpeApiOperations) != 0)
+   memset(&(p_dsl_api_cdevs), 0x00, sizeof(struct cdev *) * DSL_DRV_MAX_SUPPORTED_ENTITIES);
+
+   dsl_devt = MKDEV(nMajorNum, 0);
+   result = register_chrdev_region(dsl_devt, DSL_DRV_ENTITIES, DRV_DSL_CPE_API_DEV_NAME);
+
+   if (result < 0)
    {
       DSL_DEBUG(DSL_DBG_ERR,
          (DSL_NULL, SYS_DBG_ERR""DSL_DRV_CRLF DSL_DRV_CRLF"unable to register "
@@ -392,14 +400,65 @@ static int DSL_DRV_DevNodeInit(DSL_void_t)
       return PTR_ERR(dsl_class);
    }
 
-   /* create /dev/ entry for each device */
-   for (i=0; i < DSL_DRV_ENTITIES; i++)
+   for (i = 0; i < DSL_DRV_ENTITIES; ++i)
    {
       dsl_devt = MKDEV(nMajorNum, i);
-      device_create(dsl_class, NULL, dsl_devt, NULL, "%s/%i", "dsl_cpe_api", i);
+
+      p_dsl_api_cdevs[i] = cdev_alloc();
+      if (p_dsl_api_cdevs[i] != NULL)
+      {
+         p_dsl_api_cdevs[i]->ops = &dslCpeApiOperations;
+         p_dsl_api_cdevs[i]->owner = THIS_MODULE;
+      }
+      else
+      {
+         DSL_DEBUG(DSL_DBG_ERR,
+            (DSL_NULL, SYS_DBG_ERR""DSL_DRV_CRLF DSL_DRV_CRLF
+             "cannot allocate cdev <dev_node=%d>", MINOR(dsl_devt)));
+         goto DRV_DSL_API_DEV_NODE_INIT_ERR;
+      }
+
+      result = cdev_add(p_dsl_api_cdevs[i], dsl_devt, 1);
+      if (result < 0)
+      {
+         DSL_DEBUG(DSL_DBG_ERR,
+            (DSL_NULL, SYS_DBG_ERR""DSL_DRV_CRLF DSL_DRV_CRLF
+             "cannot add cdev <dev_node=%d> to system (result=%d)", MINOR(dsl_devt), result));
+         goto DRV_DSL_API_DEV_NODE_INIT_ERR;
+      }
+
+      tmp_dev = device_create(dsl_class, NULL, dsl_devt, NULL,
+                              "%s/%i",
+                              "dsl_cpe_api", i);
+
+      if (IS_ERR(tmp_dev))
+      {
+         DSL_DEBUG(DSL_DBG_ERR,
+            (DSL_NULL, SYS_DBG_ERR""DSL_DRV_CRLF DSL_DRV_CRLF"cannot create device node <%s/%i>",
+             "dsl_cpe_api", i));
+         goto DRV_DSL_API_DEV_NODE_INIT_ERR;
+      }
    }
 
    return 0;
+
+DRV_DSL_API_DEV_NODE_INIT_ERR:
+   for (i = 0; i < DSL_DRV_ENTITIES; ++i)
+   {
+      cdev_del(p_dsl_api_cdevs[i]);
+      p_dsl_api_cdevs[i] = NULL;
+   }
+
+   if (!IS_ERR(dsl_class))
+   {
+      class_destroy(dsl_class);
+      dsl_class = NULL;
+   }
+
+   dsl_devt = MKDEV(nMajorNum, 0);
+   unregister_chrdev_region(dsl_devt, DSL_DRV_ENTITIES);
+
+   return result;
 }
 
 /*
@@ -1335,12 +1394,20 @@ void __exit DSL_ModuleCleanup(void)
    {
       dsl_devt = MKDEV(nMajorNum, i);
       device_destroy(dsl_class, dsl_devt);
+
+      if (p_dsl_api_cdevs[i])
+      {
+         cdev_del(p_dsl_api_cdevs[i]);
+         p_dsl_api_cdevs[i] = NULL;
+      }
    }
+
    class_destroy(dsl_class);
    dsl_class = NULL;
 
-   unregister_chrdev(nMajorNum, DRV_DSL_CPE_API_DEV_NAME);
-   
+   dsl_devt = MKDEV(nMajorNum, 0);
+   unregister_chrdev_region(dsl_devt, DSL_DRV_ENTITIES);
+
    DSL_DRV_Cleanup();
 
    return;
diff --git a/src/device/drv_dsl_cpe_device_vrx.c b/src/device/drv_dsl_cpe_device_vrx.c
index c9d05fdccaf7c52d5aaa3fc3b9171b520b8bb1f6..d42053632ad0dbf7292f41db323d4e8e29b64118 100644
--- a/src/device/drv_dsl_cpe_device_vrx.c
+++ b/src/device/drv_dsl_cpe_device_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.
@@ -37,6 +39,7 @@ static VRX_CodeString_t ChipString[]=
 #ifdef DSL_VRX_DEVICE_VR11
    {0x00, "VRX-DFE_V1.1"},
    {0x01, "VRX-DFE_V1.2"},
+   {0x02, "VRX-DFE_V2.1"},
 #else
    {0x01, "VRX-DFE_V1.1"},
 #endif /* DSL_VRX_DEVICE_VR11 */
@@ -335,7 +338,7 @@ DSL_Error_t DSL_DRV_VRX_CamExceptionHandle(
          /* Update FW reinit counter*/
          if (
 #ifdef DSL_VRX_DEVICE_VR11
-             (lineInitStatus.nLineInitSubStatus == LINIT_SUB_S_PP_CLOCK_NEW) ||
+             (lineInitStatus.nLineInitSubStatus == LINIT_SUB_S_AUTOMSG) ||
 #endif /* DSL_VRX_DEVICE_VR11 */
              (lineInitStatus.nLineInitSubStatus == LINIT_SUB_FW_RETRY) ||
              (lineInitStatus.nLineInitSubStatus == LINIT_SUB_S_PP_DRIVER))
@@ -1820,12 +1823,15 @@ DSL_Error_t DSL_DRV_VRX_FailReasonGet(
       lineInitSubStatus = LINIT_SUB_S_INTENDED_LOCAL_SHUTDOWN;
       break;
 #if defined (DSL_VRX_DEVICE_VR11)
-   case ALM_ModemFSM_FailReasonGet_S_PP_CLOCK_NEW:
-      lineInitSubStatus = LINIT_SUB_S_PP_CLOCK_NEW;
+   case ALM_ModemFSM_FailReasonGet_S_AUTOMSG:
+      lineInitSubStatus = LINIT_SUB_S_AUTOMSG;
       break;
    case ALM_ModemFSM_FailReasonGet_S_PP_ERB_INIT:
       lineInitSubStatus = LINIT_SUB_S_PP_ERB_INIT;
       break;
+   case ALM_ModemFSM_FailReasonGet_S_REBOOT_REQ:
+      lineInitSubStatus = LINIT_SUB_S_REBOOT_REQ;
+      break;
 #endif /* defined (DSL_VRX_DEVICE_VR11) */
    default:
       lineInitSubStatus = LINIT_SUB_UNKNOWN;
@@ -2212,6 +2218,10 @@ DSL_Error_t DSL_DRV_VRX_LineStatusGet(
       ACK_LineStatusUS_Get_t FUS;
       ACK_LineStatusDS_Get_t FDS;
    } sAck;
+#if defined (DSL_VRX_DEVICE_VR11)
+   DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+   ACK_VDSL_FeatureMapGet_t nFeatureMapGetAck = { 0 };
+#endif
 
    DSL_CHECK_POINTER(pContext,pData);
    DSL_CHECK_ERR_CODE();
@@ -2265,6 +2275,36 @@ DSL_Error_t DSL_DRV_VRX_LineStatusGet(
       /* FW special value equals API special value */
       pData->ACTATP  = nDirection == DSL_DOWNSTREAM ? sAck.FDS.ACTATPds:
                                                       sAck.FUS.ACTATPus;
+
+      /* if not supported, SNR_ROC and ACTINP_ROC return special values */
+      pData->SNR_ROC = -641;
+      pData->ACTINP_ROC = 255;
+#if defined (DSL_VRX_DEVICE_VR11)
+      if (DSL_DRV_VRX_FirmwareXdslModeCheck(pContext, DSL_VRX_FW_VDSL2))
+      {
+         /* minimum FW version for ROC is R6 */
+         nErrCode = DSL_DRV_VRX_FirmwareVersionCheck(pContext, DSL_MIN_FW_VERSION_VR11_R6, &nVerCheck);
+         if (nErrCode == DSL_SUCCESS && nVerCheck >= DSL_VERSION_EQUAL)
+         {
+            /* related FeatureMap bit WOF15 has to be enabled */
+            nErrCode = DSL_DRV_VRX_SendMsgFeatureMapGet(pContext, (DSL_uint8_t *)&nFeatureMapGetAck);
+            if (nErrCode == DSL_SUCCESS && nFeatureMapGetAck.W0F15 == VRX_ENABLE)
+            {
+               /* Downstream/Upstream actual SNR margin of ROC */
+               pData->SNR_ROC = nDirection == DSL_DOWNSTREAM ? (DSL_int16_t)sAck.FDS.SNRM_ROCds :
+                  (DSL_int16_t)sAck.FUS.SNRM_ROCus;
+               /* Check for special FW value (-512) and map it to special API value (-641) */
+               pData->SNR_ROC = pData->SNR_ROC == -512 ? -641 : pData->SNR_ROC;
+
+               /* Downstream/Upstream actual impulse noise protection of ROC */
+               DSL_CTX_READ_SCALAR(pContext, nErrCode,
+                  ActualImpulseNoiseProtectionRoc[nDirection][0],
+                  pData->ACTINP_ROC);
+            }
+         }
+      }
+#endif /* defined (DSL_VRX_DEVICE_VR11) */
+
    }
 
    return (nErrCode);
@@ -2445,6 +2485,7 @@ static DSL_Error_t DSL_DRV_VRX_BearerChStatusGet(
    DSL_uint32_t ActInp = 0;
    DSL_uint32_t ActInpRein = 0;
    DSL_uint32_t ActInpNoErasure = 0;
+   DSL_uint32_t ActInpRoc = 0;
    DSL_uint32_t newDataRate = 0, newNetDataRate = 0;
    DSL_boolean_t bTrellisEnable = DSL_FALSE;
    DSL_uint32_t ActualInterleaveDelay = 0;
@@ -2607,6 +2648,7 @@ static DSL_Error_t DSL_DRV_VRX_BearerChStatusGet(
    /*                    ActualImpulseNoiseProtection                         */
    /*                  ActualImpulseNoiseProtectionRein                       */
    /*                ActualImpulseNoiseProtectionNoErasure                    */
+   /*                  ActualImpulseNoiseProtectionRoc                        */
    /* *********************************************************************** */
    if (nVerCheck >= DSL_VERSION_EQUAL)
    {
@@ -2635,6 +2677,10 @@ static DSL_Error_t DSL_DRV_VRX_BearerChStatusGet(
       ActInp = (sAckBchRtx.ActInpSHINE >= 1023) ? 1023 : sAckBchRtx.ActInpSHINE;
    }
 
+   ActInpRoc = (nDir == DSL_UPSTREAM) ?
+      DSL_MAX(sAckBch.FUS.actInpNoErasure_LP0, sAckBch.FUS.actInpErasure_LP0) :
+      DSL_MAX(sAckBch.FDS.actInpNoErasure_LP0, sAckBch.FDS.actInpErasure_LP0);
+
    DSL_CTX_WRITE_SCALAR(pContext, nErrCode,
                         ActualImpulseNoiseProtection[nDir][0], ActInp);
 
@@ -2645,6 +2691,10 @@ static DSL_Error_t DSL_DRV_VRX_BearerChStatusGet(
                         ActualImpulseNoiseProtectionNoErasure[nDir][0],
                         ActInpNoErasure);
 
+   DSL_CTX_WRITE_SCALAR(pContext, nErrCode,
+                        ActualImpulseNoiseProtectionRoc[nDir][0],
+                        ActInpRoc);
+
    return (nErrCode);
 }
 
@@ -2657,6 +2707,9 @@ static DSL_Error_t DSL_DRV_VRX_ChannelStatusUpdate(
    DSL_uint32_t newDataRate = 0;
    DSL_boolean_t bTrellisEnable = DSL_FALSE, bBitswapEnable = DSL_FALSE,
                  bVirtualNoiseEnable = DSL_FALSE;
+   DSL_FeatureSupport_t bRocEnable = DSL_FEATURE_DISABLED;
+   DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+
    union
    {
       ACK_LineStatusUS_Get_t FUS;
@@ -2703,6 +2756,29 @@ static DSL_Error_t DSL_DRV_VRX_ChannelStatusUpdate(
       DSL_CTX_WRITE_SCALAR(
          pContext, nErrCode, lineFeatureDataSts[nDirection].bVirtualNoiseSupport,
          bVirtualNoiseEnable);
+
+      nErrCode = DSL_DRV_VRX_FirmwareVersionCheck(pContext,
+               DSL_MIN_FW_VERSION_VR11_R6, &nVerCheck);
+
+      if (nErrCode != DSL_SUCCESS)
+      {
+         DSL_DEBUG(DSL_DBG_ERR,
+            (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FW version check failed - "
+             "ROC feature unavailable!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+         return nErrCode;
+      }
+
+      if (nVerCheck >= DSL_VERSION_EQUAL)
+      {
+         bRocEnable = nDirection == DSL_UPSTREAM ?
+                     (DSL_boolean_t)sAckLs.FUS.ROCstatus_us :
+                     (DSL_boolean_t)sAckLs.FDS.ROCstatus_ds;
+
+         DSL_CTX_WRITE_SCALAR(
+            pContext, nErrCode, lineFeatureDataSts[nDirection].bRocEnable,
+            bRocEnable);
+      }
    }
 
    nErrCode = DSL_DRV_VRX_SendMsgOlrStatusGet(pContext, nDirection, (DSL_uint8_t*)&sAckOlr.FUS);
@@ -4462,18 +4538,24 @@ DSL_Error_t DSL_DRV_DEV_ModemWriteConfig(
    }
 
    DSL_CTX_READ_SCALAR(pContext, nErrCode, bFwEventActivation, bFwEventActivation);
-   if (bFwEventActivation)
+   nErrCode = DSL_DRV_VRX_SendMsgModemFSMEventConfigure(pContext, bFwEventActivation);
+   if (nErrCode != DSL_SUCCESS)
    {
-      nErrCode = DSL_DRV_VRX_SendMsgModemFSMEventConfigure(pContext, bFwEventActivation);
+      DSL_DEBUG( DSL_DBG_ERR,
+         (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - ModemFSMEventConfigure send failed!"
+         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
 
-      if( nErrCode != DSL_SUCCESS )
-      {
-         DSL_DEBUG( DSL_DBG_ERR,
-            (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - ModemFSMEventConfigure send failed!"
-            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+      return nErrCode;
+   }
 
-          return nErrCode;
-      }
+   nErrCode = DSL_DRV_VRX_SendMsgOperatorSelectConfigSet(pContext);
+   if (nErrCode != DSL_SUCCESS)
+   {
+      DSL_DEBUG( DSL_DBG_ERR,
+         (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - DSL_DRV_VRX_SendMsgOperatorSelectConfigSet send failed!"
+         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+      return nErrCode;
    }
 
    return DSL_SUCCESS;
@@ -4533,9 +4615,11 @@ DSL_Error_t DSL_DRV_DEV_FwDownload(
    DSL_FirmwareType_t nNextMode;
 #if defined (DSL_VRX_DEVICE_VR11)
    DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+   ACK_VDSL_FeatureMapGet_t nFeatureMapGetAck = { 0 };
 #endif /* defined (DSL_VRX_DEVICE_VR11) */
    DSL_boolean_t bFwEventActivation;
    DSL_uint32_t nOppositeLine;
+   DSL_HybridType_t nHybridType;
 
    DSL_CHECK_POINTER(pContext, pContext->pDevCtx->lowHandle);
    DSL_CHECK_ERR_CODE();
@@ -4828,6 +4912,7 @@ DSL_Error_t DSL_DRV_DEV_FwDownload(
 
       DSL_CTX_WRITE_SCALAR(pContext, nErrCode, pDevCtx->bFirmwareReady, DSL_TRUE);
 
+      DSL_CTX_WRITE_SCALAR(pContext, nErrCode, VersionInformation.bFWVerNumSet, DSL_FALSE);
       /* Get the downloaded FW version information*/
       if( DSL_DRV_VRX_SendMsgFwVerInfoGet(pContext, &verNum) != DSL_SUCCESS)
       {
@@ -4852,7 +4937,37 @@ DSL_Error_t DSL_DRV_DEV_FwDownload(
          return nErrCode;
       }
 
-      #if defined (DSL_VRX_DEVICE_VR11)
+      DSL_CTX_WRITE_SCALAR(pContext, nErrCode, VersionInformation.bChipHWVerNumSet, DSL_FALSE);
+      if( DSL_DRV_VRX_SendMsgHwVerInfoGet(pContext, &verNum) != DSL_SUCCESS)
+      {
+         DSL_DEBUG( DSL_DBG_ERR,
+            (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - HW version get failed, msg send error!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+         return DSL_ERROR;
+      }
+
+      DSL_CTX_WRITE_SCALAR(pContext, nErrCode, VersionInformation.bHybridTypeSet, DSL_FALSE);
+      if( DSL_DRV_VRX_SendMsgHybridTypeGet(pContext, &nHybridType) != DSL_SUCCESS)
+      {
+         DSL_DEBUG( DSL_DBG_ERR,
+            (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - Hybrid type get failed, msg send error!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+         return DSL_ERROR;
+      }
+
+      #if defined(DSL_VRX_DEVICE_VR11)
+      DSL_CTX_WRITE_SCALAR(pContext, nErrCode, VersionInformation.bFeatureMapSet, DSL_FALSE);
+      if( DSL_DRV_VRX_SendMsgFeatureMapGet(pContext, (DSL_uint8_t *)(&nFeatureMapGetAck)) != DSL_SUCCESS)
+      {
+         DSL_DEBUG( DSL_DBG_ERR,
+            (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FeatureMap get failed, msg send error!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+         return DSL_ERROR;
+      }
+
       DSL_DRV_VRX_FirmwareVersionCheck(pContext, DSL_MIN_FW_VERSION_VR11_R5, &nVerCheck);
 
       if (nVerCheck < DSL_VERSION_EQUAL)
@@ -4907,7 +5022,17 @@ DSL_Error_t DSL_DRV_DEV_FwDownload(
       {
          nOppositeLine = (DSL_DEV_NUM(pContext) + 1) % DSL_DRV_ENTITIES;
 
-         ifxDevices[nOppositeLine].pContext->bFwEventActivation = bFwEventActivation;
+         if (ifxDevices[nOppositeLine].pContext != DSL_NULL)
+         {
+            ifxDevices[nOppositeLine].pContext->bFwEventActivation = bFwEventActivation;
+         }
+         else
+         {
+            DSL_DEBUG( DSL_DBG_WRN, (pContext,
+               SYS_DBG_WRN"DSL[%02d]: WARNING - Bonding enabled but "
+               "opposite line context not initialized!"
+               DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+         }
       }
 
       /* Get Near-End inventory information*/
@@ -5289,6 +5414,7 @@ DSL_Error_t DSL_DRV_DEV_LinkPowerDown(
 
       return DSL_ERROR;
    }
+   DSL_CTX_WRITE_SCALAR(pContext, nErrCode, bPowerDownInaccessibleFW, DSL_TRUE);
 
    DSL_DEBUG( DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: OUT - DSL_DRV_DEV_LinkPowerDown"
@@ -6809,7 +6935,7 @@ DSL_Error_t DSL_DRV_DEV_OlrStatisticsGet(
       return nErrCode;
    }
 
-   memset(pData, 0x0, sizeof(DSL_OlrStatistics_t));
+   memset(&pData->data, 0x0, sizeof(DSL_OlrStatisticsData_t));
 
    pData->data.nBitswapRequested = sAckOlr.FUS.BitswapReqs;
    pData->data.nExtBitswapRequested = sAckOlr.FUS.ExtBitswapReqs;
@@ -6818,11 +6944,15 @@ DSL_Error_t DSL_DRV_DEV_OlrStatisticsGet(
    pData->data.nSraRequested = sAckOlr.FUS.SRA_Reqs;
    pData->data.nSraExecuted = sAckOlr.FUS.SRAsDone;
    pData->data.nSraRejected = sAckOlr.FUS.SRA_UTCs;
+   pData->data.nSosRequested = sAckOlr.FUS.SOS_Reqs;
+   pData->data.nSosExecuted = sAckOlr.FUS.SOS_Done;
+   pData->data.nSosRejected = sAckOlr.FUS.SOS_UTCs;
 
    if (pData->nDirection == DSL_DOWNSTREAM)
    {
       pData->data.nBitswapTimeout = sAckOlr.FDS.BitswapTimeOuts;
       pData->data.nSraTimeout =  sAckOlr.FDS.SRA_TimeOuts;
+      pData->data.nSosTimeout = sAckOlr.FDS.SOS_TimeOuts;
    }
 
    DSL_DEBUG( DSL_DBG_MSG, (pContext,
diff --git a/src/device/drv_dsl_cpe_msg_vrx.c b/src/device/drv_dsl_cpe_msg_vrx.c
index 6503f3ac3a8aef9aae269403f607cb1c21a6aa78..3d4db7000f77ad615f7fd3d19ebdcc3dd574e24a 100644
--- a/src/device/drv_dsl_cpe_msg_vrx.c
+++ b/src/device/drv_dsl_cpe_msg_vrx.c
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-          Copyright 2018 Intel Corporation
-          Copyright 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.
@@ -182,6 +184,9 @@ static DSL_uint16_t g_VRxMsgWhitelist[] =
    CMD_ADSL_FEATUREMAPGET,          /*     +     :      +      :       +      */
    CMD_VDSL_FEATUREMAPGET,          /*     +     :      +      :       +      */
 #endif
+   CMD_SOS_STATSNE_GET,             /*     +     :      +      :       +      */
+   CMD_SOS_STATSFE_GET,             /*     +     :      +      :       +      */
+   CMD_OPERATORSELECT,              /*     +     :      +      :       +      */
       /* Delimeter only*/
    0xFFFF
 };
@@ -205,6 +210,7 @@ static DSL_VRX_PM_MsgCheck_t g_VRxPM_MsgChecklist[] =
 
 #ifdef INCLUDE_DSL_G997_LINE_INVENTORY
 static DSL_void_t DSL_DRV_VRX_Array16_to_8(
+   DSL_Context_t *pContext,
    DSL_uint16_t *pIn,
    DSL_uint8_t inSz,
    DSL_uint8_t *pOut,
@@ -233,7 +239,7 @@ DSL_Error_t DSL_DRV_VRX_BitAllocationTableGet(
                   nRetCode = DSL_SUCCESS;
    DSL_uint32_t   nMsgId = 0;
    DSL_uint16_t   i = 0, nTonesLeft = 0, nTonesCurrent = 0, nTonesMax = 0,
-                  nAckSize = 0, nAckIndex = 0, nAckLength = 0;
+                  nAckSize = 0, nAckIndex = 0, nAckLength = 0, nOneMoreEntry = 0;
    DSL_LineStateValue_t   nCurrentState = DSL_LINESTATE_UNKNOWN;
    /* assume US/DS ADSL/VDSL to have the same CMD Structures */
    CMD_BAT_TableEntriesGet_t  sCmd;
@@ -329,6 +335,7 @@ DSL_Error_t DSL_DRV_VRX_BitAllocationTableGet(
          pBand = &sBandList.nBand[nBand];
          /*  several messages for max 128*2 values have to be sent */
          nTonesLeft = (pBand->nLastToneIndex - pBand->nFirstToneIndex) + 1;
+         nOneMoreEntry = pBand->nFirstToneIndex % 2;
 
          while (nTonesLeft)
          {
@@ -336,8 +343,19 @@ DSL_Error_t DSL_DRV_VRX_BitAllocationTableGet(
 
             /* the Msg structure allows retreival in pairs only */
             sCmd.Index = (pBand->nLastToneIndex - (nTonesLeft - 1)) / 2;
-            /* round up, to avoid missing last tone */
-            sCmd.Length = (nTonesCurrent + 1) / 2;
+
+            /* to avoid missing last tone:
+               - round-up entries amount and
+               - request one additional entry in case first tone index is odd */
+            sCmd.Length = ((nTonesCurrent + 1) / 2) + nOneMoreEntry;
+            sCmd.Length = sCmd.Length > nMaxNumOfEntries ? nMaxNumOfEntries : sCmd.Length;
+
+            DSL_DEBUG(DSL_DBG_MSG,(pContext,
+               SYS_DBG_MSG"DSL[%02d]: Tones(first:%d, last:%d, left:%d). Requested entries(idx:%d, qty:%d)."
+               DSL_DRV_CRLF, DSL_DEV_NUM(pContext),
+               pBand->nFirstToneIndex, pBand->nLastToneIndex, nTonesLeft,
+               sCmd.Index, sCmd.Length));
+
             nRetCode = DSL_DRV_VRX_SendMessage(pContext, nMsgId,
                            sizeof(sCmd), (DSL_uint8_t*)&sCmd,
                            nAckSize, (DSL_uint8_t*)&sAck);
@@ -385,9 +403,9 @@ DSL_Error_t DSL_DRV_VRX_BitAllocationTableGet(
                      }
 
                      DSL_DEBUG(DSL_DBG_MSG,(pContext,
-                        SYS_DBG_MSG"%04X, ", pData->nNSCData[(i+nAckIndex)*2]));
-                     DSL_DEBUG(DSL_DBG_MSG,(pContext,
-                        SYS_DBG_MSG"%04X, ", pData->nNSCData[(i+nAckIndex)*2 + 1]));
+                        SYS_DBG_MSG"(%d,%02X) (%d,%02X)" DSL_DRV_CRLF,
+                        (i+nAckIndex)*2, pData->nNSCData[(i+nAckIndex)*2],
+                        (i+nAckIndex)*2 + 1, pData->nNSCData[(i+nAckIndex)*2 + 1]));
                   }
 
                   if (pBitsPerSymbol != DSL_NULL)
@@ -1174,8 +1192,6 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryFeGet(
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_VRX_SendMsgInventoryFeGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
 
-   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
-
    /* do the G994 Vendor ID */
    memset(&sCmd, 0, sizeof(sCmd));
    memset(&sAck, 0, sizeof(sAck));
@@ -1195,6 +1211,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryFeGet(
    {
       /* get the data */
       DSL_DRV_VRX_Array16_to_8(
+         pContext,
          sAck.G994VendorId.vendorID,
          DSL_ARRAY_LENGTH(sAck.G994VendorId.vendorID),
          pContext->lineInventoryFe.G994VendorID,
@@ -1220,6 +1237,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryFeGet(
    {
       /* get the data */
       DSL_DRV_VRX_Array16_to_8(
+         pContext,
          sAck.VendorId.sysVendorID,
          DSL_ARRAY_LENGTH(sAck.VendorId.sysVendorID),
          pContext->lineInventoryFe.SystemVendorID,
@@ -1247,6 +1265,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryFeGet(
    {
       /* get the data */
       DSL_DRV_VRX_Array16_to_8(
+         pContext,
          sAck.VendorVersion.versionNum,
          DSL_ARRAY_LENGTH(sAck.VendorVersion.versionNum),
          pContext->lineInventoryFe.VersionNumber,
@@ -1274,6 +1293,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryFeGet(
    {
       /* get the data */
       DSL_DRV_VRX_Array16_to_8(
+         pContext,
          sAck.VendorSerial.serialNum,
          DSL_ARRAY_LENGTH(sAck.VendorSerial.serialNum),
          pContext->lineInventoryFe.SerialNumber,
@@ -1305,8 +1325,6 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryFeGet(
       }
    }
 
-   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
-
    /* Update FE ADSL XTSE Capabilities*/
    if (DSL_DRV_VRX_FirmwareXdslModeCheck(pContext, DSL_VRX_FW_ADSL))
    {
@@ -1605,6 +1623,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgOrderlyShutDownRequest(
 
 #ifdef INCLUDE_DSL_G997_LINE_INVENTORY
 static DSL_void_t DSL_DRV_VRX_Array16_to_8(
+   DSL_Context_t *pContext,
    DSL_uint16_t *pIn,
    DSL_uint8_t inSz,
    DSL_uint8_t *pOut,
@@ -1612,6 +1631,7 @@ static DSL_void_t DSL_DRV_VRX_Array16_to_8(
 {
    DSL_uint8_t i = 0;
 
+   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
    for( i = 0; i < inSz; i++ )
    {
       if( (DSL_uint32_t)(i*2 + 1) < outSz )
@@ -1620,6 +1640,7 @@ static DSL_void_t DSL_DRV_VRX_Array16_to_8(
          pOut[i*2]     = (DSL_uint8_t)(pIn[i]);
       }
    }
+   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
 }
 
 /*
@@ -1975,11 +1996,12 @@ static DSL_Error_t DSL_DRV_VRX_MsgTransmit(
    DSL_uint16_t i;
    DSL_uint32_t nLength, nLenAck;
    DSL_uint8_t nMsgFctOpCode = 0;
+   const DSL_uint8_t nMaxRetry = 3;
 
    nLength = pMsg->write_msg.paylSize_byte;
    nLenAck = pMsg->ack_msg.paylSize_byte;
 
-   for (i=0; i<3; i++)
+   for (i=0; i<nMaxRetry; ++i)
    {
       /* for any retry set the CMD and ACK Buffer length again,
          because the driver is changing these fields to indicate
@@ -1990,7 +2012,21 @@ static DSL_Error_t DSL_DRV_VRX_MsgTransmit(
       /* Send and wait for recieved data */
       if(nRet == DSL_SUCCESS)
       {
-         break;
+         /* check if received ID was the same as the sent one */
+         if ( ((DSL_uint16_t)(pMsg->write_msg.msgId & 0xFFFF)) != pMsg->ack_msg.msgId)
+         {
+            nRet = DSL_ERR_FUNCTION_WAITING;
+
+            DSL_DEBUG(DSL_DBG_WRN, (pContext, SYS_DBG_WRN
+               "DSL[%02d]: Ack mismatch in MsgID (0x%04X vs 0x%04X expected) "
+               "- on try %d!" DSL_DRV_CRLF,
+               DSL_DEV_NUM(pContext), pMsg->ack_msg.msgId, pMsg->write_msg.msgId, i));
+         }
+         else
+         {
+            /* Message send succeeded, terminate retry loop */
+            break;
+         }
       }
       else
       {
@@ -2007,7 +2043,7 @@ static DSL_Error_t DSL_DRV_VRX_MsgTransmit(
 
                bBlockLine = DSL_TRUE;
                nRet = DSL_ERR_MSG_EXCHANGE;
-               i = 3;
+               i = nMaxRetry;
                break;
 
             case -e_MEI_ERR_DEV_NEG_RESP:
@@ -2029,7 +2065,7 @@ static DSL_Error_t DSL_DRV_VRX_MsgTransmit(
                     )
                {
                   nRet = DSL_WRN_FIRMWARE_MSG_DENIED;
-                  i = 3;
+                  i = nMaxRetry;
                }
                else if(nMsgFctOpCode == D2H_CMV_CURRENTLY_UNAVAILABLE)
                {
@@ -2064,7 +2100,7 @@ static DSL_Error_t DSL_DRV_VRX_MsgTransmit(
                      DSL_DEV_NUM(pContext), pMsg->write_msg.msgId,
                      pMsg->ack_msg.msgClassifier, i));
                   nRet = DSL_WRN_FIRMWARE_MSG_DENIED;
-                  i = 3;
+                  i = nMaxRetry;
                   break;
                }
                else
@@ -2090,7 +2126,7 @@ static DSL_Error_t DSL_DRV_VRX_MsgTransmit(
                      DSL_DEV_NUM(pContext),
                      pMsg->write_msg.msgId, pMsg->ack_msg.msgClassifier, i));
                   nRet = DSL_WRN_FIRMWARE_MSG_DENIED;
-                  i = 3;
+                  i = nMaxRetry;
                   break;
                }
 #else
@@ -2106,7 +2142,7 @@ static DSL_Error_t DSL_DRV_VRX_MsgTransmit(
                   if (pMsg->ack_msg.msgClassifier != 0xFFFF)
                   {
                      /* an ACK has been received - stop sending, keep line */
-                     i = 3;
+                     i = nMaxRetry;
                      break;
                   }
                }
@@ -2123,6 +2159,14 @@ static DSL_Error_t DSL_DRV_VRX_MsgTransmit(
       }
    }
 
+   if (i >= nMaxRetry)
+   {
+      DSL_DEBUG(DSL_DBG_ERR, (pContext, SYS_DBG_ERR
+         "DSL[%02d]: Max number of retries (%d) to send msg reached, "
+         "terminate with error!"DSL_DRV_CRLF,
+         DSL_DEV_NUM(pContext), nMaxRetry));
+   }
+
    if(nRet != DSL_SUCCESS)
    {
       /* Error - Line not available */
@@ -2165,7 +2209,24 @@ DSL_Error_t DSL_DRV_VRX_SendMessage(
    IOCTL_MEI_messageSend_t sMsg;
    DSL_boolean_t bMsgSendRequired = DSL_FALSE;
    DSL_uint32_t i = 0;
-   DSL_uint8_t nMaxRetry;
+
+#if defined (DSL_VRX_DEVICE_VR11)
+   DSL_boolean_t bPowerDownInaccessibleFW = DSL_FALSE;
+   DSL_Error_t nTmpErrCode = DSL_ERROR;
+
+   DSL_CTX_READ_SCALAR(pContext, nTmpErrCode, bPowerDownInaccessibleFW, bPowerDownInaccessibleFW);
+
+   if (nTmpErrCode == DSL_SUCCESS &&
+       bPowerDownInaccessibleFW == DSL_TRUE)
+   {
+      DSL_DEBUG(DSL_DBG_WRN,
+         (pContext, SYS_DBG_WRN"DSL[%02d]: Message handling denied "
+         "in PD mode (MsgID=0x%04X)!" DSL_DRV_CRLF,
+         DSL_DEV_NUM(pContext), nMsgID));
+
+      return DSL_ERR_NOT_SUPPORTED_IN_CURRENT_AUTOBOOT_STATE;
+   }
+#endif
 
    /* Handle VRX message white list*/
    while (g_VRxMsgWhitelist[i] != 0xFFFF)
@@ -2234,48 +2295,20 @@ DSL_Error_t DSL_DRV_VRX_SendMessage(
       return DSL_ERROR;
    }
 
-   i = 0;
-   nMaxRetry = 3;
-   while (i < nMaxRetry)
-   {
-      nErrCode = DSL_SUCCESS;
-      sMsg.write_msg.msgId          = (DSL_uint16_t)(nMsgID & 0xFFFF);
-      sMsg.write_msg.pPayload       = (unsigned char *)pData;
-      sMsg.write_msg.paylSize_byte  = nLength;
-      /* to receive the answer hand over the payload buffer */
-      sMsg.ack_msg.pPayload         = (unsigned char *)pDataAck;
-
-      sMsg.ack_msg.msgId = 0;
-      sMsg.write_msg.paylSize_byte  = nLength;
-      sMsg.ack_msg.paylSize_byte    = nLenAck;
+   sMsg.write_msg.msgId          = (DSL_uint16_t)(nMsgID & 0xFFFF);
+   sMsg.write_msg.pPayload       = (unsigned char *)pData;
+   sMsg.write_msg.paylSize_byte  = nLength;
 
-      nErrCode = DSL_DRV_VRX_MsgTransmit(pContext, &sMsg);
+   /* to receive the answer hand over the payload buffer */
+   sMsg.ack_msg.pPayload         = (unsigned char *)pDataAck;
+   sMsg.ack_msg.msgId = 0;
+   sMsg.ack_msg.paylSize_byte    = nLenAck;
 
-      /* check if received ID was the same as the sent one */
-      if ( ((DSL_uint16_t)(nMsgID & 0xFFFF)) !=
-           sMsg.ack_msg.msgId && nErrCode > DSL_ERROR )
-      {
-         DSL_DEBUG(DSL_DBG_WRN, (pContext, SYS_DBG_WRN
-            "DSL[%02d]: Ack mismatch in MsgID (0x%04X vs 0x%04X expected) "
-            "- on try %d!" DSL_DRV_CRLF,
-            DSL_DEV_NUM(pContext), sMsg.ack_msg.msgId, nMsgID, i));
-         i++;
-      }
-      else
-      {
-         /* Message send succeeded, terminate retry loop */
-         break;
-      }
-   }
+   nErrCode = DSL_DRV_VRX_MsgTransmit(pContext, &sMsg);
 
-   if (i >= nMaxRetry)
+   if (nErrCode != DSL_SUCCESS)
    {
-      nErrCode = DSL_ERR_FUNCTION_WAITING;
       pContext->nErrNo = nErrCode;
-      DSL_DEBUG(DSL_DBG_ERR, (pContext, SYS_DBG_ERR
-         "DSL[%02d]: Max number of retries (%d) to send msg reached, "
-         "terminate with error!"DSL_DRV_CRLF,
-         DSL_DEV_NUM(pContext), nMaxRetry));
    }
 
    DSL_DRV_MUTEX_UNLOCK(pContext->bspMutex);
@@ -3752,15 +3785,18 @@ static DSL_Error_t DSL_DRV_VRX_SendMsgAuxInventoryInfoOGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    CMD_AuxInventoryInfo_O_Get_t sCmd;
    ACK_AuxInventoryInfo_O_Get_t sAck;
-   DSL_uint32_t nBytes = sizeof(pData->pData);
+   DSL_uint32_t nBytes = 0;
    DSL_uint8_t i = 0;
 
    /* do the Aux Info, not part of G997.1 */
    memset(&sCmd, 0, sizeof(sCmd));
    memset(&sAck, 0, sizeof(sAck));
 
+   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
    /* there was nothing copied yet */
    pData->nLength = 0;
+   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
+
    sCmd.Length = DSL_VRX_16BIT_RD_MSG_LEN_GET(sAck);
 
    nErrCode = DSL_DRV_VRX_SendMessage(
@@ -3777,7 +3813,9 @@ static DSL_Error_t DSL_DRV_VRX_SendMsgAuxInventoryInfoOGet(
       return nErrCode;
    }
 
+   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
    pData->nLength = (sCmd.Length * 2);
+   nBytes = sizeof(pData->pData);
 
    /* get the data */
    for( i = 0; i < DSL_ARRAY_LENGTH(sAck.auxInfo); i++ )
@@ -3788,6 +3826,7 @@ static DSL_Error_t DSL_DRV_VRX_SendMsgAuxInventoryInfoOGet(
          pData->pData[i*2]     = (DSL_uint8_t)(sAck.auxInfo[i]);
       }
    }
+   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
 
    return nErrCode;
 }
@@ -3817,12 +3856,11 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_VRX_SendMsgInventoryNeSet()"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
 
-   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
-
    /* do the Vendor ID */
    memset(&sCmd, 0, sizeof(sCmd));
 
    sCmd.VendorId.Length = DSL_VRX_16BIT_RD_MSG_LEN_GET(sCmd.VendorId);
+   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
    /* fill the message */
    for (i = 0; i < DSL_ARRAY_LENGTH(sCmd.VendorId.sysVendorID); i++)
    {
@@ -3832,6 +3870,8 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
             ((DSL_uint16_t)(pContext->lineInventoryNe.SystemVendorID[i*2 + 1]) << 8) |
              (DSL_uint16_t)(pContext->lineInventoryNe.SystemVendorID[i*2]);
    }
+   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
+
    nErrCode = DSL_DRV_VRX_SendMessage(
                  pContext, CMD_SYSVENDORID_R_SET,
                  sizeof(sCmd.VendorId), (DSL_uint8_t*)&sCmd,
@@ -3848,6 +3888,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
    memset(&sCmd, 0, sizeof(sCmd));
 
    sCmd.VendorVersion.Length = DSL_VRX_16BIT_RD_MSG_LEN_GET(sCmd.VendorVersion);
+   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
    for (i = 0; i < DSL_ARRAY_LENGTH(sCmd.VendorVersion.versionNum); i++)
    {
       if( (DSL_uint32_t)(i*2 + 1) <
@@ -3856,6 +3897,8 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
             ((DSL_uint16_t)(pContext->lineInventoryNe.VersionNumber[i*2 + 1]) << 8) |
              (DSL_uint16_t)(pContext->lineInventoryNe.VersionNumber[i*2]);
    }
+   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
+
    nErrCode = DSL_DRV_VRX_SendMessage(
                  pContext, CMD_SYSVENDORVERSIONNUM_R_SET,
                  sizeof(sCmd.VendorVersion), (DSL_uint8_t*)&sCmd,
@@ -3872,6 +3915,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
    memset(&sCmd, 0, sizeof(sCmd));
 
    sCmd.VendorSerial.Length = DSL_VRX_16BIT_RD_MSG_LEN_GET(sCmd.VendorSerial);
+   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
    for (i = 0; i < DSL_ARRAY_LENGTH(sCmd.VendorSerial.serialNum); i++)
    {
       if( (DSL_uint32_t)(i*2 + 1) <
@@ -3880,6 +3924,8 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
             ((DSL_uint16_t)(pContext->lineInventoryNe.SerialNumber[i*2 + 1]) << 8) |
              (DSL_uint16_t)(pContext->lineInventoryNe.SerialNumber[i*2]);
    }
+   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
+
    nErrCode = DSL_DRV_VRX_SendMessage(
                  pContext, CMD_SYSVENDORSERIALNUM_R_SET,
                  sizeof(sCmd.VendorSerial), (DSL_uint8_t*)&sCmd,
@@ -3898,7 +3944,9 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
       /* do the Aux Info, not part of G997.1 */
       memset(&sCmd, 0, sizeof(sCmd));
 
+      DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
       nBytesLeft = (DSL_uint16_t)(pContext->auxInventoryNe.nLength);
+      DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
       nBytesSent = 0;
       nBytesMsg = DSL_VRX_16BIT_RD_MSG_LEN_GET(sCmd.AuxInfo) * 2;
       while( nBytesLeft )
@@ -3908,6 +3956,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
          sCmd.AuxInfo.Length  = (nBytes + 1) / 2;
          sCmd.AuxInfo.Index   = nBytesSent / 2;
 
+         DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
          for( i = 0; (i < sCmd.AuxInfo.Length) && (i < DSL_ARRAY_LENGTH(sCmd.AuxInfo.auxInfo)) &&
                      (nIdx+1 < DSL_G993_LI_MAXLEN_AUX);
               i++, nIdx = i*2 + nBytesSent)
@@ -3916,6 +3965,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
                ((DSL_uint16_t)(pContext->auxInventoryNe.pData[nIdx + 1]) << 8) |
                 (DSL_uint16_t)(pContext->auxInventoryNe.pData[nIdx]);
          }
+         DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
 
          nErrCode = DSL_DRV_VRX_SendMessage(
                        pContext, CMD_AUXINVENTORYINFO_R_SET,
@@ -3933,8 +3983,6 @@ DSL_Error_t DSL_DRV_VRX_SendMsgInventoryNeSet(
       }
    }
 
-   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
-
    if( nErrCode != DSL_SUCCESS )
       nErrCode = DSL_ERROR;
 
@@ -4059,6 +4107,25 @@ DSL_Error_t DSL_DRV_VRX_SendMsgOlrControl(
       sCmd.TxBitswap = bBitswapEnableUs ? VRX_ENABLE : VRX_DISABLE;
    }
 
+   nErrCode = DSL_DRV_VRX_FirmwareVersionCheck(pContext,
+               DSL_MIN_FW_VERSION_VR11_R6, &nVerCheck);
+
+   if (nErrCode != DSL_SUCCESS)
+   {
+      DSL_DEBUG(DSL_DBG_ERR,
+                (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FW version check failed - " \
+                 "ROC feature unavailable!"
+                 DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+      return nErrCode;
+   }
+
+   if (nVerCheck >= DSL_VERSION_EQUAL)
+   {
+      sCmd.RxBitswap_ROC = VRX_ENABLE;
+      sCmd.TxBitswap_ROC = VRX_ENABLE;
+   }
+
    nErrCode = DSL_DRV_VRX_SendMessage(
                  pContext, CMD_OLR_CONTROL,
                  sizeof(CMD_OLR_Control_t), (DSL_uint8_t*)&sCmd,
@@ -4083,6 +4150,8 @@ DSL_Error_t DSL_DRV_VRX_SendMsgRtxControl(
                           nVerCheckUs = DSL_VERSION_ERROR;
    DSL_VRX_FwVersion_t  sFwVersion = {0};
    DSL_DEV_VersionCheck_t nVerCheck = DSL_VERSION_ERROR;
+   DSL_DslModeSelection_t nXdslMode = DSL_MODE_VDSL;
+   DSL_FeatureSupport_t bRocEnable = DSL_FEATURE_DISABLED;
 
    if (DSL_DRV_VRX_FirmwareXdslModeCheck(pContext, DSL_VRX_FW_VDSL2))
    {
@@ -4103,6 +4172,8 @@ DSL_Error_t DSL_DRV_VRX_SendMsgRtxControl(
    }
    else if (DSL_DRV_VRX_FirmwareXdslModeCheck(pContext, DSL_VRX_FW_ADSL))
    {
+      nXdslMode = DSL_MODE_ADSL;
+
       /* Get FW information (US not supported for ADSL, use initial value
          (nVerCheckUs equals DSL_VERSION_ERROR) indicating missing support. */
       nErrCode = DSL_DRV_VRX_FirmwareVersionCheck(pContext,
@@ -4215,6 +4286,29 @@ DSL_Error_t DSL_DRV_VRX_SendMsgRtxControl(
       }
    }
 
+   nRetCode = DSL_DRV_VRX_FirmwareVersionCheck(pContext,
+                                               DSL_MIN_FW_VERSION_VR11_R6,
+                                               &nVerCheck);
+   if (nRetCode != DSL_SUCCESS)
+   {
+      DSL_DEBUG(DSL_DBG_ERR, (pContext,
+         SYS_DBG_ERR"DSL[%02d]: ERROR - FW version check failed -" \
+         "ROC feature unavailable!"
+         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+   }
+   else if (nVerCheck >= DSL_VERSION_EQUAL)
+   {
+      DSL_CTX_READ_SCALAR(pContext, nErrCode,
+            lineFeatureDataCfg[nXdslMode][DSL_UPSTREAM].bRocEnable,
+            bRocEnable);
+      sCmd.ROC_US = bRocEnable;
+
+      DSL_CTX_READ_SCALAR(pContext, nErrCode,
+            lineFeatureDataCfg[nXdslMode][DSL_DOWNSTREAM].bRocEnable,
+            bRocEnable);
+      sCmd.ROC_DS = bRocEnable;
+   }
+
    sCmd.Length = DSL_VRX_16BIT_RD_MSG_LEN_GET(sCmd);
 
    nErrCode = DSL_DRV_VRX_SendMessage(
@@ -4355,6 +4449,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgStandardInfoFeVdsl2Get(
          DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
    }
 
+   DSL_DRV_MUTEX_LOCK(pContext->dataMutex);
    /* get the data */
    pXTSE[8-1] &= ~(DSL_uint8_t)(XTSE_8_01_A|XTSE_8_02_B|XTSE_8_03_C);
    if (sAck.A_US0PsdSup21 ||
@@ -4393,6 +4488,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgStandardInfoFeVdsl2Get(
        sAck.C_US0PsdSup12 ||
        sAck.C_US0PsdSup13)
        pXTSE[8-1] |= (DSL_uint8_t)XTSE_8_03_C;
+   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
 
    DSL_DEBUG(DSL_DBG_MSG,(pContext,
       SYS_DBG_MSG"DSL[%02d]: OUT - DSL_DRV_VRX_SendMsgStandardInfoFeVdsl2Get"
@@ -5480,13 +5576,8 @@ DSL_Error_t DSL_DRV_VRX_SendMsgLineStatusGet(
    nMsgId = nDirection == DSL_DOWNSTREAM ? CMD_LINESTATUSDS_GET :
                                            CMD_LINESTATUSUS_GET;
 
-   /*
-      Starting with VDSL-FW version w.8.x.y.z.a another16-Bit word was appended
-      (--> Length=9). The same will be done in future ADSL releases (check release
-      notes). Older VDSL FW-versions and all current ADSL FW-versions can
-      request only 8 parameters (Length=8).
-   */
-   sCmd.Length = 9;
+   /* currently 11 16-Bit word parameters (--> Length=11) */
+   sCmd.Length = 11;
 
    nErrCode = DSL_DRV_VRX_SendMessage( pContext, nMsgId,
       sizeof(CMD_LineStatusUS_Get_t), (DSL_uint8_t*)&sCmd,
@@ -5892,25 +5983,41 @@ DSL_Error_t DSL_DRV_VRX_SendMsgFwVerInfoGet(
    CMD_VersionInfoGet_t  sCmd = {0, 3};
    ACK_VersionInfoGet_t  sAck;
    DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_boolean_t bFWVerNumSet = DSL_TRUE;
 
    DSL_DEBUG( DSL_DBG_MSG, (pContext,
       SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_VRX_SendMsgFwVerInfoGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
 
-   nErrCode = DSL_DRV_VRX_SendMessage(pContext,
-      (DSL_uint16_t)CMD_VERSIONINFOGET,
-      sizeof(sCmd), (DSL_uint8_t*)&sCmd,
-      sizeof(ACK_VersionInfoGet_t), (DSL_uint8_t*)&sAck);
-
-   if(nErrCode == DSL_SUCCESS)
+   DSL_CTX_READ_SCALAR(pContext, nErrCode, VersionInformation.bFWVerNumSet, bFWVerNumSet);
+   if (bFWVerNumSet == DSL_FALSE)
    {
-      *pVerNum = (DSL_uint32_t)sAck.FW_Version;
+      nErrCode = DSL_DRV_VRX_SendMessage(pContext,
+         (DSL_uint16_t)CMD_VERSIONINFOGET,
+         sizeof(sCmd), (DSL_uint8_t*)&sCmd,
+         sizeof(ACK_VersionInfoGet_t), (DSL_uint8_t*)&sAck);
+
+      if(nErrCode == DSL_SUCCESS)
+      {
+         DSL_CTX_WRITE_SCALAR(pContext, nErrCode, VersionInformation.bFWVerNumSet, DSL_TRUE);
+
+         *pVerNum = (DSL_uint32_t)sAck.FW_Version;
+         pContext->VersionInformation.nFWVerNum = *pVerNum;
+      }
+      else
+      {
+         DSL_DEBUG(DSL_DBG_ERR,(pContext,
+            SYS_DBG_ERR"DSL[%02d]: ERROR - Failed to retrieve FW Version!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+      }
    }
    else
    {
-      DSL_DEBUG(DSL_DBG_ERR,(pContext,
-         SYS_DBG_ERR"DSL[%02d]: ERROR - Failed to retrieve FW Version!"
+      DSL_DEBUG(DSL_DBG_MSG,(pContext,
+         SYS_DBG_MSG"DSL[%02d]: DSL_DRV_VRX_SendMsgFwVerInfoGet - internal data reused."
          DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+      *pVerNum = pContext->VersionInformation.nFWVerNum;
    }
 
    DSL_DEBUG(DSL_DBG_MSG,(pContext,
@@ -5931,27 +6038,42 @@ DSL_Error_t DSL_DRV_VRX_SendMsgHwVerInfoGet(
    CMD_VersionInfoGet_t  sCmd = {0, 3};
    ACK_VersionInfoGet_t  sAck;
    DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_boolean_t bChipHWVerNumSet = DSL_TRUE;
 
    DSL_DEBUG( DSL_DBG_MSG, (pContext,
       SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_VRX_SendMsgHwVerInfoGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
 
-   nErrCode = DSL_DRV_VRX_SendMessage(pContext,
-      (DSL_uint16_t)CMD_VERSIONINFOGET,
-      sizeof(sCmd), (DSL_uint8_t*)&sCmd,
-      sizeof(ACK_VersionInfoGet_t), (DSL_uint8_t*)&sAck);
-
-   if(nErrCode == DSL_SUCCESS)
+   DSL_CTX_READ_SCALAR(pContext, nErrCode, VersionInformation.bChipHWVerNumSet, bChipHWVerNumSet);
+   if (bChipHWVerNumSet == DSL_FALSE)
    {
-      *pVerNum = (DSL_uint32_t)sAck.HW_Version;
+      nErrCode = DSL_DRV_VRX_SendMessage(pContext,
+         (DSL_uint16_t)CMD_VERSIONINFOGET,
+         sizeof(sCmd), (DSL_uint8_t*)&sCmd,
+         sizeof(ACK_VersionInfoGet_t), (DSL_uint8_t*)&sAck);
+
+      if(nErrCode == DSL_SUCCESS)
+      {
+         DSL_CTX_WRITE_SCALAR(pContext, nErrCode, VersionInformation.bChipHWVerNumSet, DSL_TRUE);
+
+         *pVerNum = (DSL_uint32_t)sAck.HW_Version;
+         pContext->VersionInformation.nChipHWVerNum = *pVerNum;
+      }
+      else
+      {
+         DSL_DEBUG(DSL_DBG_ERR,(pContext,
+            SYS_DBG_ERR"DSL[%02d]: ERROR - Failed to retrieve HW Version!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+      }
    }
    else
    {
-      DSL_DEBUG(DSL_DBG_ERR,(pContext,
-         SYS_DBG_ERR"DSL[%02d]: ERROR - Failed to retrieve HW Version!"
+      DSL_DEBUG(DSL_DBG_MSG,(pContext,
+         SYS_DBG_MSG"DSL[%02d]: DSL_DRV_VRX_SendMsgHwVerInfoGet - internal data reused."
          DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-   }
 
+      *pVerNum = pContext->VersionInformation.nChipHWVerNum;
+   }
 
    DSL_DEBUG(DSL_DBG_MSG,(pContext,
       SYS_DBG_MSG"DSL[%02d]: OUT - DSL_DRV_VRX_SendMsgHwVerInfoGet"
@@ -5971,27 +6093,42 @@ DSL_Error_t DSL_DRV_VRX_SendMsgHybridTypeGet(
    CMD_HybridGet_t  sCmd = {0,1};
    ACK_HybridGet_t  sAck = {0,0,0};
    DSL_Error_t nErrCode = DSL_SUCCESS;
+   DSL_boolean_t bHybridTypeSet = DSL_TRUE;
 
    DSL_DEBUG( DSL_DBG_MSG, (pContext,
       SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_VRX_SendMsgHybridTypeGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
 
-   nErrCode = DSL_DRV_VRX_SendMessage(pContext,
-      (DSL_uint16_t)CMD_HYBRIDGET,
-      sizeof(sCmd), (DSL_uint8_t*)&sCmd,
-      sizeof(ACK_HybridGet_t), (DSL_uint8_t*)&sAck);
-
-   if(nErrCode == DSL_SUCCESS)
+   DSL_CTX_READ_SCALAR(pContext, nErrCode, VersionInformation.bHybridTypeSet, bHybridTypeSet);
+   if (bHybridTypeSet == DSL_FALSE)
    {
-      *pHybridType = (DSL_uint32_t)sAck.HybridType;
+      nErrCode = DSL_DRV_VRX_SendMessage(pContext,
+         (DSL_uint16_t)CMD_HYBRIDGET,
+         sizeof(sCmd), (DSL_uint8_t*)&sCmd,
+         sizeof(ACK_HybridGet_t), (DSL_uint8_t*)&sAck);
+
+      if(nErrCode == DSL_SUCCESS)
+      {
+         DSL_CTX_WRITE_SCALAR(pContext, nErrCode, VersionInformation.bHybridTypeSet, DSL_TRUE);
+
+         *pHybridType = (DSL_uint32_t)sAck.HybridType;
+         pContext->VersionInformation.nHybridType = *pHybridType;
+      }
+      else
+      {
+         DSL_DEBUG(DSL_DBG_ERR,(pContext,
+            SYS_DBG_ERR"DSL[%02d]: ERROR - Failed to retrieve HW Version!"
+            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+      }
    }
    else
    {
-      DSL_DEBUG(DSL_DBG_ERR,(pContext,
-         SYS_DBG_ERR"DSL[%02d]: ERROR - Failed to retrieve HW Version!"
+      DSL_DEBUG(DSL_DBG_MSG,(pContext,
+         SYS_DBG_MSG"DSL[%02d]: DSL_DRV_VRX_SendMsgHybridTypeGet - internal data reused."
          DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
-   }
 
+      *pHybridType = pContext->VersionInformation.nHybridType;
+   }
 
    DSL_DEBUG(DSL_DBG_MSG,(pContext,
       SYS_DBG_MSG"DSL[%02d]: OUT - DSL_DRV_VRX_SendMsgHybridTypeGet"
@@ -6222,6 +6359,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgMiscConfigSet(
    }
 
    /* Set default values */
+   sCmd.HlogValidation = VRX_ENABLE;
    sCmd.ShortClrA2p = VRX_ENABLE;
    sCmd.ShortClrA2 = VRX_ENABLE;
    sCmd.ShortClrA1 = VRX_ENABLE;
@@ -6662,6 +6800,7 @@ DSL_Error_t DSL_DRV_VRX_SendMsgFeatureMapGet(
       ACK_ADSL_FeatureMapGet_t AFM;
       ACK_VDSL_FeatureMapGet_t VFM;
    } sAck;
+   DSL_boolean_t bFeatureMapSet = DSL_TRUE;
 
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
@@ -6673,14 +6812,29 @@ DSL_Error_t DSL_DRV_VRX_SendMsgFeatureMapGet(
    memset(&sCmd, 0, sizeof(sCmd));
    sCmd.Length = DSL_VRX_16BIT_RD_MSG_LEN_GET(sAck.AFM);
 
-   nErrCode = DSL_DRV_VRX_SendMessage(pContext,
-      DSL_DRV_VRX_FirmwareXdslModeCheck(pContext, DSL_VRX_FW_VDSL2) ? CMD_VDSL_FEATUREMAPGET : CMD_ADSL_FEATUREMAPGET,
-      sizeof(sCmd), (DSL_uint8_t*)&sCmd,
-      sizeof(ACK_ADSL_FeatureMapGet_t), (DSL_uint8_t*)&sAck);
+   DSL_CTX_READ_SCALAR(pContext, nErrCode, VersionInformation.bFeatureMapSet, bFeatureMapSet);
+   if (bFeatureMapSet == DSL_FALSE)
+   {
+      nErrCode = DSL_DRV_VRX_SendMessage(pContext,
+         DSL_DRV_VRX_FirmwareXdslModeCheck(pContext, DSL_VRX_FW_VDSL2) ? CMD_VDSL_FEATUREMAPGET : CMD_ADSL_FEATUREMAPGET,
+         sizeof(sCmd), (DSL_uint8_t*)&sCmd,
+         sizeof(ACK_ADSL_FeatureMapGet_t), (DSL_uint8_t*)&sAck);
 
-   if (nErrCode >= DSL_SUCCESS)
+      if (nErrCode >= DSL_SUCCESS)
+      {
+         DSL_CTX_WRITE_SCALAR(pContext, nErrCode, VersionInformation.bFeatureMapSet, DSL_TRUE);
+
+         memcpy(pAck, &sAck, sizeof(ACK_ADSL_FeatureMapGet_t));
+         memcpy(&(pContext->VersionInformation.sFeatureMap), &sAck, sizeof(ACK_ADSL_FeatureMapGet_t));
+      }
+   }
+   else
    {
-      memcpy(pAck, &sAck, sizeof(ACK_ADSL_FeatureMapGet_t));
+      DSL_DEBUG(DSL_DBG_MSG,(pContext,
+         SYS_DBG_MSG"DSL[%02d]: DSL_DRV_VRX_SendMsgFeatureMapGet - internal data reused."
+         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+      memcpy(pAck, &(pContext->VersionInformation.sFeatureMap), sizeof(ACK_ADSL_FeatureMapGet_t));
    }
 
    DSL_DEBUG( DSL_DBG_MSG,
@@ -6691,4 +6845,41 @@ DSL_Error_t DSL_DRV_VRX_SendMsgFeatureMapGet(
 }
 #endif /* (DSL_VRX_DEVICE_VR11) */
 
+/*
+   For a detailed description of the function, its arguments and return value
+   please refer to the description in the header file 'drv_dsl_cpe_msg_vrx.h'
+*/
+DSL_Error_t DSL_DRV_VRX_SendMsgOperatorSelectConfigSet(
+   DSL_Context_t *pContext)
+{
+   DSL_Error_t nErrCode = DSL_SUCCESS;
+   CMD_OperatorSelect_t sCmd;
+   ACK_OperatorSelect_t sAck;
+   DSL_uint16_t nDslOperator = 0;
+
+   DSL_CHECK_CTX_POINTER(pContext);
+   DSL_CHECK_ERR_CODE();
+
+   DSL_DEBUG( DSL_DBG_MSG,
+      (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_VRX_SendMsgOperatorSelectConfigSet"
+      DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+   DSL_CTX_READ_SCALAR(pContext, nErrCode, nDslOperator, nDslOperator);
+
+   memset(&sCmd, 0, sizeof(sCmd));
+   sCmd.Length = 1;
+   sCmd.DslOperator = (DSL_uint8_t)(nDslOperator);
+
+   nErrCode = DSL_DRV_VRX_SendMessage( pContext, CMD_OPERATORSELECT,
+                  sizeof(sCmd), (DSL_uint8_t*)&sCmd,
+                  sizeof(sAck), (DSL_uint8_t*)&sAck );
+
+   DSL_DEBUG( DSL_DBG_MSG,
+      (pContext, SYS_DBG_MSG"DSL[%02d]: OUT - DSL_DRV_VRX_SendMsgOperatorSelectConfigSet," \
+       " nDslOperator=%hhu, retCode=%d" DSL_DRV_CRLF, DSL_DEV_NUM(pContext),
+       (DSL_uint8_t)(nDslOperator), nErrCode));
+
+   return (nErrCode);
+}
+
 #endif /* #ifdef INCLUDE_DSL_CPE_API_VRX*/
diff --git a/src/g997/drv_dsl_cpe_api_g997.c b/src/g997/drv_dsl_cpe_api_g997.c
index fabdc069d04d0b5995e9ab385eab031f8cc3c1ef..395679ddc7adf07cab02fb187e4b94ac20ee57b5 100644
--- a/src/g997/drv_dsl_cpe_api_g997.c
+++ b/src/g997/drv_dsl_cpe_api_g997.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.
@@ -12,6 +14,9 @@
 
 #include "drv_dsl_cpe_api.h"
 #include "drv_dsl_cpe_device_g997.h"
+#ifdef __LINUX__
+#include <linux/capability.h>
+#endif /* __LINUX__ */
 
 #ifdef __cplusplus
    extern "C" {
@@ -31,6 +36,14 @@ DSL_Error_t DSL_DRV_G997_SnmpMessageSend(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -62,6 +75,14 @@ DSL_Error_t DSL_DRV_G997_SnmpMessageReceive(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -94,6 +115,14 @@ DSL_Error_t DSL_DRV_G997_LineActivateConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_LineActivateConfigSet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -177,6 +206,14 @@ DSL_Error_t DSL_DRV_G997_LineActivateConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_LineActivateConfigGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -206,6 +243,14 @@ DSL_Error_t DSL_DRV_G997_XTUSystemEnablingConfigSet(
    DSL_uint8_t nLine;
    DSL_Context_t *pCurrCtx;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_XTUSystemEnablingConfigSet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -250,6 +295,14 @@ DSL_Error_t DSL_DRV_G997_XTUSystemEnablingConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_XTUSystemEnablingConfigGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -278,6 +331,14 @@ DSL_Error_t DSL_DRV_G997_XTUSystemEnablingStatusGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_LineStateValue_t nCurrentState = DSL_LINESTATE_UNKNOWN;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_XTUSystemEnablingStatusGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -329,6 +390,14 @@ DSL_Error_t DSL_DRV_G997_ChannelDataRateThresholdConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -359,6 +428,14 @@ DSL_Error_t DSL_DRV_G997_ChannelDataRateThresholdConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -391,6 +468,14 @@ DSL_Error_t DSL_DRV_G997_LineTransmissionStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_LineTransmissionStatusGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -420,6 +505,14 @@ DSL_Error_t DSL_DRV_G997_LineInitStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_LineInitStatusGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -448,6 +541,14 @@ DSL_Error_t DSL_DRV_G997_AttainableNdrStatusGet (
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG, (pContext,
       SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_AttainableNdrStatusGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -479,6 +580,14 @@ DSL_Error_t DSL_DRV_G997_LineStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -510,6 +619,14 @@ DSL_Error_t DSL_DRV_G997_LineStatusPerBandGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_LineStatusPerBandGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -537,6 +654,14 @@ DSL_Error_t DSL_DRV_G997_UsPowerBackOffStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_UsPowerBackOffStatusGet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -563,7 +688,19 @@ DSL_Error_t DSL_DRV_G997_RateAdaptationConfigSet(
    DSL_IN DSL_Context_t *pContext,
    DSL_IN_OUT DSL_G997_RateAdaptationConfig_t *pData)
 {
+   DSL_boolean_t bReTxEnable = DSL_FALSE, bRocEnable = DSL_FALSE;
    DSL_Error_t nErrCode = DSL_SUCCESS;
+#if defined (DSL_VRX_DEVICE_VR11)
+   ACK_VDSL_FeatureMapGet_t nFeatureMapGetAck = { 0 };
+#endif
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
 
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
@@ -586,12 +723,74 @@ DSL_Error_t DSL_DRV_G997_RateAdaptationConfigSet(
    }
    else
    {
-#if defined(INCLUDE_DSL_CPE_API_DANUBE) || defined(INCLUDE_DSL_CPE_API_VRX)
+#if defined(INCLUDE_DSL_CPE_API_DANUBE)
       if (pData->data.RA_MODE == DSL_G997_RA_MODE_DYNAMIC_SOS)
       {
          return DSL_ERR_NOT_SUPPORTED_BY_FIRMWARE;
       }
 #endif /* INCLUDE_DSL_CPE_API_DANUBE*/
+
+      if (pData->data.RA_MODE == DSL_G997_RA_MODE_DYNAMIC_SOS)
+      {
+         if (pData->nDslMode == DSL_MODE_VDSL)
+         {
+            /* ReTx has to be enabled */
+            DSL_CTX_READ_SCALAR(pContext, nErrCode,
+               lineFeatureDataCfg[pData->nDslMode][pData->nDirection].bReTxEnable,
+               bReTxEnable);
+
+            if (bReTxEnable == DSL_TRUE)
+            {
+#if defined (DSL_VRX_DEVICE_VR11)
+               /* ROC has to be enabled */
+               DSL_CTX_READ_SCALAR(pContext, nErrCode,
+                  lineFeatureDataCfg[pData->nDslMode][pData->nDirection].bRocEnable,
+                  bRocEnable);
+
+               if (bRocEnable == DSL_TRUE)
+               {
+                  /* related FeatureMap bit WOF13 has to be enabled */
+                  nErrCode = DSL_DRV_VRX_SendMsgFeatureMapGet(pContext, (DSL_uint8_t *)&nFeatureMapGetAck);
+                  if (nErrCode == DSL_SUCCESS)
+                  {
+                     if (nFeatureMapGetAck.W0F13 == VRX_DISABLE)
+                     {
+                        DSL_DEBUG(DSL_DBG_WRN,
+                           (pContext, SYS_DBG_WRN
+                           "DSL[%02d]: Feature-Bit13 is disabled, SOS will NOT be enabled!"
+                           DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+                        return DSL_ERR_NOT_SUPPORTED_BY_FIRMWARE;
+                     }
+                  }
+                  else
+                  {
+                     DSL_DEBUG(DSL_DBG_ERR,
+                        (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - FeatureMap get failed!"
+                        DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
+
+                     return DSL_ERR_NOT_SUPPORTED_BY_FIRMWARE;
+                  }
+               }
+               else
+               {
+                  return DSL_ERR_NOT_SUPPORTED_BY_FIRMWARE;
+               }
+#else
+               return DSL_ERR_NOT_SUPPORTED_BY_FIRMWARE;
+#endif /* defined (DSL_VRX_DEVICE_VR11) */
+            }
+            else
+            {
+               return DSL_ERR_RETRANSMISSION_DISABLED;
+            }
+         }
+         else
+         {
+            return DSL_ERR_NOT_SUPPORTED_BY_FIRMWARE;
+         }
+      }
+
       /* Update internal Rate Adaptation Mode Settings for the selected
          xDSL mode and direction */
       DSL_CTX_WRITE(pContext, nErrCode,
@@ -618,6 +817,14 @@ DSL_Error_t DSL_DRV_G997_RateAdaptationConfigGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_G997_RA_MODE_t nSRAmode = DSL_G997_RA_MODE_AT_INIT;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -658,6 +865,14 @@ DSL_Error_t DSL_DRV_G997_RateAdaptationStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -689,6 +904,14 @@ DSL_Error_t DSL_DRV_G997_ChannelStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -722,6 +945,14 @@ DSL_Error_t DSL_DRV_G997_PowerManagementStateForcedTrigger(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -750,6 +981,14 @@ DSL_Error_t DSL_DRV_G997_PowerManagementStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -778,6 +1017,14 @@ DSL_Error_t DSL_DRV_G997_LastStateTransmittedGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -809,6 +1056,14 @@ DSL_Error_t DSL_DRV_G997_BitAllocationNSCGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -839,6 +1094,14 @@ DSL_Error_t DSL_DRV_G997_GainAllocationNscGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -869,6 +1132,14 @@ DSL_Error_t DSL_DRV_G997_SnrAllocationNscGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -902,6 +1173,14 @@ DSL_Error_t DSL_DRV_G997_AlarmMaskLineFailuresConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -965,6 +1244,14 @@ DSL_Error_t DSL_DRV_G997_AlarmMaskLineFailuresConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1006,6 +1293,14 @@ DSL_Error_t DSL_DRV_G997_LineFailuresStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1081,6 +1376,14 @@ DSL_Error_t DSL_DRV_G997_AlarmMaskDataPathFailuresConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1142,6 +1445,14 @@ DSL_Error_t DSL_DRV_G997_AlarmMaskDataPathFailuresConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1183,6 +1494,14 @@ DSL_Error_t DSL_DRV_G997_DataPathFailuresStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1241,6 +1560,14 @@ DSL_Error_t DSL_DRV_G997_FramingParameterStatusGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1279,6 +1606,14 @@ DSL_Error_t DSL_DRV_G997_LineInventoryGet(
    DSL_LineStateValue_t nCurrentState = DSL_LINESTATE_UNKNOWN;
    DSL_boolean_t bFeLineInventoryValid = DSL_FALSE, bFeLineInventoryIncomplete = DSL_FALSE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1341,6 +1676,14 @@ DSL_Error_t DSL_DRV_G997_LineInventorySet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_DEBUG(DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_G997_LineInventorySet"
       DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
@@ -1370,6 +1713,14 @@ DSL_Error_t DSL_DRV_G997_DeltHlinScaleGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1402,6 +1753,14 @@ DSL_Error_t DSL_DRV_G997_DeltHlinGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1434,6 +1793,14 @@ DSL_Error_t DSL_DRV_G997_DeltHlogGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1466,6 +1833,14 @@ DSL_Error_t DSL_DRV_G997_DeltQLNGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1498,6 +1873,14 @@ DSL_Error_t DSL_DRV_G997_DeltSNRGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1529,6 +1912,15 @@ DSL_Error_t DSL_DRV_G997_DeltFreeResources(
    DSL_IN_OUT DSL_G997_DeltFreeResources_t *pData)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1572,6 +1964,15 @@ DSL_Error_t DSL_DRV_G997_LowPowerModeConfigSet(
 )
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
+
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
@@ -1610,6 +2011,14 @@ DSL_Error_t DSL_DRV_G997_LowPowerModeConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pData);
    DSL_CHECK_ERR_CODE();
 
diff --git a/src/include/drv_dsl_cpe_api.h b/src/include/drv_dsl_cpe_api.h
index 8e10d01737ff21bfb959251d0737bbd9c3f6b06c..04a9eb67370ad78b884c4aa5c819ba7de10f8639 100644
--- a/src/include/drv_dsl_cpe_api.h
+++ b/src/include/drv_dsl_cpe_api.h
@@ -1239,6 +1239,15 @@ typedef struct
    \note The configuration and status of this feature is only available for
          ADSL only platforms and for downstream direction. */
    DSL_CFG DSL_FeatureSupport_t b20BitSupport;
+   /**
+   Robust Overhead Channel (ROC) config/status value.
+
+   \note The configuration and status of this feature is only available for
+         VDSL. In case of ADSL configuration, enabling will be ignored and an
+         according warning "DSL_WRN_CONFIG_PARAM_IGNORED" will be returned.
+   \note This feature can only be enabled for VDSL in case of Retransmission
+         (bReTxEnable) is also enabled. */
+   DSL_CFG DSL_FeatureSupport_t bRocEnable;
 } DSL_LineFeatureData_t;
 
 /**
@@ -5649,6 +5658,44 @@ typedef struct
    DSL_IN_OUT DSL_T1413VendorRevisionStatusData_t data;
 } DSL_T1413VendorRevisionStatus_t;
 
+/**
+   Structure for configuration of operator specific handling.
+*/
+typedef struct
+{
+   /**
+      Defines operator specific handling which will be applied within
+      DSL PHY Firmware context.
+
+      The valid range of the value is from 0 to 19 (dec).
+      The default configuration value is 0, which means that no operator
+      specific handling is selected.
+
+      For more details on the requirements to select a configuration value
+      which differs from zero, please refer to DSL Subsystem Release
+      information's.
+
+      \note The unsigned integer value is transparently mapped to the
+            DSL PHY Firmware definitions CMD_OperatorSelect_<xxx> */
+   DSL_IN_OUT DSL_uint16_t nDslOperator;
+} DSL_OperatorConfigData_t;
+
+/**
+   Structure for configuration of operator specific handling.
+   This structure has to be used for ioctl
+   - \ref DSL_FIO_OPERATOR_CONFIG_SET
+   - \ref DSL_FIO_OPERATOR_CONFIG_GET
+*/
+typedef struct
+{
+   /**
+   Driver control/status structure */
+   DSL_IN_OUT DSL_AccessCtl_t accessCtl;
+   /**
+   Structure that contains operator configuration data */
+   DSL_IN_OUT DSL_OperatorConfigData_t data;
+} DSL_OperatorConfig_t;
+
 #ifdef DSL_INTERN
    /* lower level device interface*/
    #include "drv_dsl_cpe_device.h"
diff --git a/src/include/drv_dsl_cpe_api_config.h b/src/include/drv_dsl_cpe_api_config.h
index 110c3a650e1a5433e19c2e0260ab045c5d8d940d..7fa1a042577eab58cddcb39ffe0f7f71b661d379 100644
--- a/src/include/drv_dsl_cpe_api_config.h
+++ b/src/include/drv_dsl_cpe_api_config.h
@@ -8,7 +8,7 @@
 /* #undef DSL_CPE_STATIC_DELT_DATA */
 
 /* Debug level = local */
-#define DSL_DBG_MAX_LEVEL_PRE 0x80
+#define DSL_DBG_MAX_LEVEL_PRE 0x40
 
 /* Preselection of max. debug level = no (using default) */
 #define DSL_DBG_MAX_LEVEL_SET /**/
@@ -170,7 +170,7 @@
 #define PACKAGE_NAME "DSL CPE API driver"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "DSL CPE API driver 4.20.1.2.0"
+#define PACKAGE_STRING "DSL CPE API driver 4.21.6"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "drv_dsl_cpe_api"
@@ -179,7 +179,7 @@
 #define PACKAGE_URL ""
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "4.20.1.2.0"
+#define PACKAGE_VERSION "4.21.6"
 
 /* Version number of package */
-#define VERSION "4.20.1.2.0"
+#define VERSION "4.21.6"
diff --git a/src/include/drv_dsl_cpe_api_error.h b/src/include/drv_dsl_cpe_api_error.h
index 766023eefdf9c571b79d96db1983b86b0f0a6273..d7f3cf67b809645a678ef7bdb11cdf957cea2baf 100644
--- a/src/include/drv_dsl_cpe_api_error.h
+++ b/src/include/drv_dsl_cpe_api_error.h
@@ -346,6 +346,8 @@ typedef enum
        the configuration to enable upstream RTX was discared. Please enable
        RTX for downstream first! */
    DSL_WRN_CONFIG_RTX_US_ONLY_SUPPORTED_WITH_DS_ENABLED = 402,
+   /** The configuration parameter can be only enabled together with RTX. */
+   DSL_WRN_CONFIG_ONLY_SUPPORTED_WITH_RTX_ENABLED = 403,
    /* *********************************************************************** */
    /* *** Bonding functionality related warning codes                     *** */
    /* *********************************************************************** */
diff --git a/src/include/drv_dsl_cpe_api_g997.h b/src/include/drv_dsl_cpe_api_g997.h
index 9544de791769931b67b02095fd199f96847f0cee..0697e31d6c739ffdef1c6b8ab5d5a12fb7e595fa 100644
--- a/src/include/drv_dsl_cpe_api_g997.h
+++ b/src/include/drv_dsl_cpe_api_g997.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.
@@ -79,7 +81,7 @@ typedef struct
    from 32 to \ref DSL_MAX_NSC.
    This structure includes an array of 8 bit values.
 
-   \note For VDSL2 with 35b profiles this data uses 4.3125kHz tone spacing with 
+   \note For VDSL2 with 35b profiles this data uses 4.3125kHz tone spacing with
          35.328Mhz bandwidth what means tones 0..8192.
 */
 typedef struct
@@ -1754,8 +1756,11 @@ typedef enum
 #if defined(DSL_VRX_DEVICE_VR11)
    /**
    Clock set mode issue */
-   LINIT_SUB_S_PP_CLOCK_NEW = 12,
+   LINIT_SUB_S_AUTOMSG = 12,
    LINIT_SUB_S_PP_ERB_INIT = 13,
+   /**
+   Recovery from PPE-FW stuck required */
+   LINIT_SUB_S_REBOOT_REQ = 14,
 #endif /* defined(DSL_VRX_DEVICE_VR11) */
 } DSL_G997_LineInitSubStatus_t;
 
@@ -1940,6 +1945,30 @@ typedef struct
    \note The downstream/upstream nominal aggregate transmit power may be taken
          as a best estimate of the parameter. */
    DSL_OUT DSL_int16_t ACTATP;
+   /**
+   Downstream/Upstream actual SNR margin of ROC (see chapter
+   7.5.1.35.1/7.5.1.35.2 of G.997.1).
+   This parameter reports the actual signal-to-noise margin of the ROC in the
+   downstream/upstream direction. The format (both range as well as special
+   value) is identical to the format of the line status parameter SNR (see
+   DSL_G997_LineStatusData_t.SNR, respectively clause 7.5.1.13/7.5.1.16 within
+   G.997.1).
+   This parameter is given "per direction", not "per band".
+   \note This value is only valid in case of VDSL. In case of ADSL the special
+         value is returned.
+   \note This value is not available in DELT (special value). */
+   DSL_OUT DSL_int16_t SNR_ROC;
+   /**
+   Downstream/Upstream actual impulse noise protection of ROC (see chapter
+   7.5.1.34.1/7.5.1.34.2 of G.997.1).
+   This parameter reports the actual impulse noise protection (INP) of the ROC
+   in the downstream/upstream direction expressed in multiples of T4k in the L0
+   state. In the L1 or L2 states, the parameter contains the value in the
+   previous L0 state.
+   The value is coded in fractions of T4k with a granularity of 0.1. The range
+   is from 0 to 25.4. A special value indicates an ACTINP-ROC higher than 25.4.
+   \note T4k equals to multiples of equivalent 4k DMT symbol length. */
+   DSL_OUT DSL_int16_t ACTINP_ROC;
 } DSL_G997_LineStatusData_t;
 
 /**
@@ -2529,7 +2558,9 @@ typedef enum
    Data rate is automatically selected at initialization and may be
    continuously adapted during operation (showtime) by SOS and SRA.
    The Rate Adaptation mode 4 is optional. In this mode, enabling of SOS
-   and SRA is mandatory.
+   and SRA is mandatory. In VRX518 SOS is implemented only for RTX
+   mode (not IFEC) on a per direction basis. SOS can only be enabled for a
+   direction if RTX support is enabled for it too.
 
    At startup:
 
@@ -2542,7 +2573,7 @@ typedef enum
    the Minimum net data rate as a result of an SOS procedure.
    Additionally, SOS may be performed, when the conditions specified
    by the SOS trigger parameters are satisfied. The detailed specification
-   of SOS OLR procedure is in G.993.2.
+   of SOS OLR procedure is in G.993.2 and G.998.4 (the RTX specific SOS items).
 
    If at startup, it is detected that SOS is not supported in the downstream
    direction by either XTU's, but SRA is supported by both XTU's,
diff --git a/src/include/drv_dsl_cpe_api_ioctl.h b/src/include/drv_dsl_cpe_api_ioctl.h
index 44510d930faab1441e1d56c2a66b8f488321f2f0..665b2416e4231107c5e703a26f7a22abf4962907 100644
--- a/src/include/drv_dsl_cpe_api_ioctl.h
+++ b/src/include/drv_dsl_cpe_api_ioctl.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.
@@ -6261,6 +6263,77 @@ typedef union
 #define DSL_FIO_PM_SYNC_MODE_GET \
    _IOWR(DSL_IOC_MAGIC_CPE_API_PM, 71, DSL_PM_SyncMode_t)
 
+/**
+   This function configures the selection of DSL operator specific handling,
+   which will be applied within DSL PHY Firmware.
+
+   CLI
+   - long command: OperatorConfigSet
+   - short command: ocs
+
+   \param DSL_OperatorConfig_t*
+      The parameter points to a \ref DSL_OperatorConfig_t structure
+
+   \return
+      0 if successful and -1 in case of an error/warning
+      In case of an error/warning please refer to the value of 'nReturn' which
+      is included within accessCtl structure of user data.
+
+   \remarks
+      Supported by
+      - VRX200: xDSL-CPE
+      - VRX300: xDSL-CPE
+      - VRX500: xDSL-CPE
+
+   \code
+      DSL_OperatorConfig_t operatorConfig;
+      DSL_int_t ret = 0;
+
+      memset(&operatorConfig, 0x00, sizeof(DSL_OperatorConfig_t));
+      // Set configuration setting here before calling the ioctl...
+      ret = DSL_CPE_Ioctl (fd, DSL_FIO_OPERATOR_CONFIG_SET, &operatorConfig);
+
+   \endcode
+
+   \ingroup DRV_DSL_CPE_COMMON */
+#define DSL_FIO_OPERATOR_CONFIG_SET \
+   _IOWR(DSL_IOC_MAGIC_CPE_API, 72, DSL_OperatorConfig_t)
+
+/**
+   This function returns the currently configured selection of the DSL operator
+   specific handling, which is applied within DSL PHY Firmware.
+
+   CLI
+   - long command: OperatorConfigGet
+   - short command: ocg
+
+   \param DSL_OperatorConfig_t*
+      The parameter points to a \ref DSL_OperatorConfig_t structure
+
+   \return
+      0 if successful and -1 in case of an error/warning
+      In case of an error/warning please refer to the value of 'nReturn' which
+      is included within accessCtl structure of user data.
+
+   \remarks
+      Supported by
+      - VRX200: xDSL-CPE
+      - VRX300: xDSL-CPE
+      - VRX500: xDSL-CPE
+
+   \code
+      DSL_OperatorConfig_t operatorConfig;
+      DSL_int_t ret = 0;
+
+      memset(&operatorConfig, 0x00, sizeof(DSL_OperatorConfig_t));
+      ret = DSL_CPE_Ioctl (fd, DSL_FIO_OPERATOR_CONFIG_GET, &operatorConfig);
+
+   \endcode
+
+   \ingroup DRV_DSL_CPE_COMMON */
+#define DSL_FIO_OPERATOR_CONFIG_GET \
+   _IOWR(DSL_IOC_MAGIC_CPE_API, 73, DSL_OperatorConfig_t)
+
 #ifdef INCLUDE_DEPRECATED
 
 /* ************************************************************************** */
diff --git a/src/include/drv_dsl_cpe_device_vrx.h b/src/include/drv_dsl_cpe_device_vrx.h
index 5e9812bd9e4aec51da3976edb3e4e5357219cd1a..78a7917637904d2cb3be8fe1eee35810280bc2aa 100644
--- a/src/include/drv_dsl_cpe_device_vrx.h
+++ b/src/include/drv_dsl_cpe_device_vrx.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2018 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.
@@ -70,6 +72,7 @@
 #define DSL_MIN_FW_VERSION_VR11_R5           0xC,  -1,  -1,  -1,  -1
 #define DSL_MIN_FW_VERSION_VR11_PD           0xC,   1,   4,  -1,  -1
 #define DSL_MIN_FW_VERSION_VR11_PD_ADSL      0xC,   1,   0,  -1,  -1
+#define DSL_MIN_FW_VERSION_VR11_R6           0xD,  -1,  -1,  -1,  -1
 
 /*
    Internal device dependent configuration options
diff --git a/src/include/drv_dsl_cpe_intern.h b/src/include/drv_dsl_cpe_intern.h
index 97011dbb896c6cf4aada44e567962aefa4324614..ee5ae4fadd7e2bc6dfaf63b35589aa1897b2c2a4 100644
--- a/src/include/drv_dsl_cpe_intern.h
+++ b/src/include/drv_dsl_cpe_intern.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.
@@ -186,6 +188,28 @@ typedef struct
 #endif /* #if defined(INCLUDE_DSL_FILTER_DETECTION)*/
 } DSL_ShowtimeMeasurement_t;
 
+/**
+   Stores version information of: FW, HW Chip, HybridType and FeatureMap
+   to avoid unnecessary messages ("FeatureMapGet", "VersionInfoGet", ...) passing.
+   Data update is per FW download.
+ */
+typedef struct
+{
+   DSL_boolean_t bFWVerNumSet;
+   DSL_boolean_t bChipHWVerNumSet;
+   DSL_boolean_t bHybridTypeSet;
+   DSL_boolean_t bFeatureMapSet;
+
+   DSL_uint32_t nFWVerNum;
+   DSL_uint32_t nChipHWVerNum;
+   DSL_HybridType_t nHybridType;
+   union
+   {
+      ACK_ADSL_FeatureMapGet_t AFM;
+      ACK_VDSL_FeatureMapGet_t VFM;
+   } sFeatureMap;
+} DSL_InternalVersionInformation_t;
+
 /**
    The driver context contains global information.
 */
@@ -246,6 +270,7 @@ struct DSL_Context
 #if defined(DSL_VRX_DEVICE_VR11)
    /** External trigger to power down DSL */
    DSL_boolean_t bPowerDown;
+   DSL_boolean_t bPowerDownInaccessibleFW;
 #endif
    /** Autoboot queue */
    DSL_DRV_Event_t autobootEvent;
@@ -391,6 +416,7 @@ struct DSL_Context
    DSL_uint16_t ActualImpulseNoiseProtection[DSL_ACCESSDIR_LAST][DSL_MAX_SUPPORTED_CHANNELS_PER_LINE];
    DSL_uint16_t ActualImpulseNoiseProtectionRein[DSL_ACCESSDIR_LAST][DSL_MAX_SUPPORTED_CHANNELS_PER_LINE];
    DSL_uint16_t ActualImpulseNoiseProtectionNoErasure[DSL_ACCESSDIR_LAST][DSL_MAX_SUPPORTED_CHANNELS_PER_LINE];
+   DSL_uint16_t ActualImpulseNoiseProtectionRoc[DSL_ACCESSDIR_LAST][DSL_MAX_SUPPORTED_CHANNELS_PER_LINE];
 
    /** Actual Data Rate per direction, per channel */
    DSL_uint32_t nChannelActualDataRate[DSL_ACCESSDIR_LAST][DSL_MAX_SUPPORTED_CHANNELS_PER_LINE];
@@ -546,8 +572,13 @@ struct DSL_Context
 
    DSL_boolean_t  bFwEventActivation;
    DSL_boolean_t  bFwEventRcvd;
+   DSL_boolean_t  bFeaturesEnabled;
    DSL_Error_t    nFwEventLastReadErr;
    DSL_LineStateValue_t nFwEventLineState;
+
+   DSL_InternalVersionInformation_t VersionInformation;
+
+   DSL_uint16_t nDslOperator;
 };
 
 #define DSL_EVENT2MASK(evt) ((DSL_uint32_t)(0x1 << ((DSL_uint32_t)evt)))
@@ -1409,6 +1440,29 @@ DSL_Error_t DSL_DRV_HybridSelectionDataGet(
 #endif
 #endif /* #ifdef INCLUDE_DSL_CPE_API_DANUBE*/
 
+
+/**
+   For a detailed description please refer to the equivalent ioctl
+   \ref DSL_FIO_OPERATOR_CONFIG_GET
+*/
+#ifndef SWIG_TMP
+DSL_Error_t DSL_DRV_OperatorSelectConfigGet(
+   DSL_IN DSL_Context_t *pContext,
+   DSL_IN_OUT DSL_OperatorConfig_t *pDat
+);
+#endif
+
+/**
+   For a detailed description please refer to the equivalent ioctl
+   \ref DSL_FIO_OPERATOR_CONFIG_SET
+*/
+#ifndef SWIG_TMP
+DSL_Error_t DSL_DRV_OperatorSelectConfigSet(
+   DSL_IN DSL_Context_t *pContext,
+   DSL_IN_OUT DSL_OperatorConfig_t *pData
+);
+#endif
+
 /** @} DRV_DSL_CPE_COMMON */
 
 
@@ -2327,11 +2381,18 @@ DSL_Error_t DSL_DRV_VRX_SendMsgModemFSMEventConfigure(
    DSL_IN DSL_boolean_t value);
 #endif
 
+#if defined (DSL_VRX_DEVICE_VR11)
 #ifndef SWIG
 DSL_Error_t DSL_DRV_VRX_SendMsgFeatureMapGet(
    DSL_IN DSL_Context_t *pContext,
    DSL_IN DSL_uint8_t *pAck);
 #endif
+#endif /* defined (DSL_VRX_DEVICE_VR11) */
+
+#ifndef SWIG
+DSL_Error_t DSL_DRV_VRX_SendMsgOperatorSelectConfigSet(
+   DSL_IN DSL_Context_t *pContext);
+#endif
 /*
    DSL IOCTL handler helpers stuff
 */
diff --git a/src/include/drv_dsl_cpe_os_linux.h b/src/include/drv_dsl_cpe_os_linux.h
index 53311a2fe7c9efac4cab19523cf4fb02bc03537c..063c6a924653cab752acebd596ff10f9476f2c8c 100644
--- a/src/include/drv_dsl_cpe_os_linux.h
+++ b/src/include/drv_dsl_cpe_os_linux.h
@@ -1,7 +1,10 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2018 Intel Corporation
+         Copyright 2016 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.
@@ -58,6 +61,7 @@
 #else
 #include <linux/smp.h>
 #endif
+#include <linux/reboot.h>     /* emergency_restart */
 
 #ifdef INCLUDE_DSL_CPE_API_IFXOS_SUPPORT
 /** IFXOS includes*/
@@ -287,6 +291,8 @@ static inline int dsl_mutex_lock(struct mutex *mutex)
    #define DSL_DRV_OS_ModUseCountDecrement() while(0) {}
 #endif
 
+#define DSL_DRV_EMERGENCY_RESTART            emergency_restart()
+
 #ifndef INCLUDE_DSL_CPE_API_IFXOS_SUPPORT
 typedef int (*DSL_DRV_KERNEL_THREAD_StartRoutine)(void *);
 
diff --git a/src/include/drv_dsl_cpe_os_rtems.h b/src/include/drv_dsl_cpe_os_rtems.h
index 55db9dc8ea788aa75af62dc8aa1a4fb840163d54..9540ca7b6f644f912689cf29a5049afc8ded2672 100644
--- a/src/include/drv_dsl_cpe_os_rtems.h
+++ b/src/include/drv_dsl_cpe_os_rtems.h
@@ -1,7 +1,7 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright (c) 2018 Intel Corporation
+         Copyright (c) 2007-2015 Lantiq Beteiligungs-GmbH & Co. KG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -101,6 +101,8 @@ DSL_uint32_t DSL_DRV_SysTimeGet(DSL_uint32_t nOffset);
 
 #define DSL_Le2Cpu(le) le16_to_cpu(le)
 
+#define DSL_DRV_EMERGENCY_RESTART
+
 /*weirong not needed
 #define DSL_VMalloc DSL_DRV_VMalloc
 #define DSL_VFree DSL_DRV_VFree
diff --git a/src/include/drv_dsl_cpe_os_vxworks.h b/src/include/drv_dsl_cpe_os_vxworks.h
index 11092bdb58d98922deae722d9185443238b389af..28c15d8d831418ff4ad570459c53900ce8ded35d 100644
--- a/src/include/drv_dsl_cpe_os_vxworks.h
+++ b/src/include/drv_dsl_cpe_os_vxworks.h
@@ -1,7 +1,7 @@
 /******************************************************************************
 
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright (c) 2018 Intel Corporation
+         Copyright (c) 2007-2015 Lantiq Beteiligungs-GmbH & Co. KG
 
   For licensing information, see the file 'LICENSE' in the root folder of
   this software module.
@@ -92,6 +92,7 @@ DSL_uint32_t DSL_DRV_SysTimeGet(DSL_uint32_t nOffset);
 #define DSL_DRV_OS_ModUseCountIncrement()
 #define DSL_DRV_OS_ModUseCountDecrement()
 
+#define DSL_DRV_EMERGENCY_RESTART
 
 #ifdef __cplusplus
 }
diff --git a/src/include/drv_dsl_cpe_os_win32.h b/src/include/drv_dsl_cpe_os_win32.h
deleted file mode 100644
index 597176cb95a8538a2a4f4f938202bccef77e6c33..0000000000000000000000000000000000000000
--- a/src/include/drv_dsl_cpe_os_win32.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/******************************************************************************
-
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
-
-  For licensing information, see the file 'LICENSE' in the root folder of
-  this software module.
-
-******************************************************************************/
-
-#ifndef _DRV_DSL_CPE_OS_WIN32_H
-#define _DRV_DSL_CPE_OS_WIN32_H
-
-#ifdef __cplusplus
-   extern "C" {
-#endif
-
-#include "drv_dsl_cpe_api.h"
-
-/** IFXOS includes*/
-#include "ifxos_common.h"
-#include "ifxos_copy_user_space.h"
-#include "ifxos_debug.h"
-#include "ifxos_event.h"
-#include "ifxos_thread.h"
-#include "ifxos_memory_alloc.h"
-#include "ifxos_memory_map.h"
-#include "ifxos_lock.h"
-#include "ifxos_time.h"
-#include "ifxos_select.h"
-#include "ifxos_mutex.h"
-#include "ifxos_device_io.h"
-
-#include "errno.h"
-
-#ifndef DSL_DRV_STACKSIZE
-#define DSL_DRV_STACKSIZE 2048
-#endif
-
-#ifndef DSL_DRV_PRIORITY
-#define DSL_DRV_PRIORITY  64
-#endif
-
-#define DSL_BYTE_ORDER           IFXOS_BYTE_ORDER
-#define DSL_LITTLE_ENDIAN        IFXOS_LITTLE_ENDIAN
-#define DSL_BIG_ENDIAN           IFXOS_BIG_ENDIAN
-
-typedef IFX_int_t                DSL_DRV_size_t;
-typedef IFX_uint32_t             DSL_DRV_TimeVal_t;
-typedef IFXOS_lock_t             DSL_DRV_Mutex_t;
-typedef IFXOS_event_t            DSL_DRV_Event_t;
-typedef IFXOS_drvSelectQueue_t   DSL_DRV_WaitQueue_t;
-
-#define  IOCPARM_MASK   0x7f     /* parameters must be < 128 bytes */
-#define  IOC_VOID       0x20000000  /* no parameters */
-#define  IOC_OUT         0x40000000 /* copy out parameters */
-#define  IOC_IN          0x80000000 /* copy in parameters */
-#define  IOC_INOUT      (IOC_IN|IOC_OUT)
-
-#ifndef _IO
-#define  _IO(x,y)    (IOC_VOID|((x)<<8)|y)
-#endif /* _IO*/
-#ifndef _IOR
-#define  _IOR(x,y,t)    (IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|y)
-#endif /* _IOR*/
-#ifndef _IOW
-#define  _IOW(x,y,t)    (IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|y)
-#endif /* _IOW*/
-#ifndef _IOWR
-#define  _IOWR(x,y,t)   (IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|y)
-#endif /* _IOWR*/
-
-#define _IOC_TYPE(x)                      (((x)>>8) & 0xFF)
-
-/* HAS TO BE CLARIFIED*/
-#define DSL_Le2Cpu(x)   (x)
-
-#define DSL_DRV_SIGNAL_PENDING               0
-
-/** IFXOS specific mapping for the system calls*/
-#define DSL_DRV_Malloc(nSize)                IFXOS_MemAlloc(nSize)
-#define DSL_DRV_MemFree(pPtr)                IFXOS_MemFree(pPtr)
-#define DSL_DRV_PMalloc(nSize)               IFXOS_BlockAlloc(nSize)
-#define DSL_DRV_PFree(pPtr)                  IFXOS_BlockFree(pPtr)
-#define DSL_DRV_MUTEX_INIT(id)               IFXOS_LockInit(&(id))
-#define DSL_DRV_MUTEX_LOCK(id)               IFXOS_LockGet(&(id))
-#define DSL_DRV_MUTEX_UNLOCK(id)             IFXOS_LockRelease(&(id))
-#define DSL_DRV_INIT_WAKELIST(name,queue)    IFXOS_DrvSelectQueueInit(&(queue))
-#define DSL_DRV_WAKEUP_WAKELIST(queue)       IFXOS_DrvSelectQueueWakeUp(&(queue), IFXOS_DRV_SEL_WAKEUP_TYPE_RD)
-#define DSL_DRV_ADD_TASK_WAKELIST            IFXOS_DrvSelectQueueAddTask
-
-#define DSL_DRV_INIT_EVENT(name,ev)          IFXOS_EventInit(&(ev));
-#define DSL_DRV_WAIT_EVENT_TIMEOUT(ev,t)     IFXOS_EventWait(&(ev), (t), IFX_NULL)
-#define DSL_DRV_WAIT_EVENT(ev)               IFXOS_EventWait(&(ev), 0xFFFFFFFF, IFX_NULL)
-#define DSL_DRV_WAKEUP_EVENT(ev)             IFXOS_EventWakeUp(&(ev));
-#define DSL_DRV_ElapsedTimeMSecGet(t)        IFXOS_ElapsedTimeMSecGet(t)
-#define DSL_DRV_TimeMSecGet()                IFXOS_ElapsedTimeMSecGet(0)
-#define DSL_WAIT(ms)                         IFXOS_MSecSleep(ms)
-#define DSL_DRV_MSecSleep(msec)              IFXOS_MSecSleep(msec)
-
-#define DSL_IsTimeNull(t)                    ((t) == 0)
-#define DSL_DRV_TimeSecGet(t)                (t)
-
-#define DSL_DRV_OS_ModUseCountIncrement()
-#define DSL_DRV_OS_ModUseCountDecrement()
-
-#define DSL_DRV_Phy2VirtMap                  IFXOS_Phy2VirtMap
-#define DSL_DRV_Phy2VirtUnmap                IFXOS_Phy2VirtUnmap
-
-/** IFXOS specific mapping*/
-typedef IFXOS_ThreadParams_t     DSL_DRV_ThreadParams_t;
-typedef IFXOS_ThreadFunction_t   DSL_DRV_ThreadFunc_t;
-typedef IFXOS_ThreadCtrl_t       DSL_DRV_ThreadCtrl_t;
-
-#define DSL_DRV_THREAD(a, b, c, d)        IFXOS_ThreadInit((a), (b), (c), DSL_DRV_STACKSIZE, DSL_DRV_PRIORITY, (d), 0)
-#define DSL_DRV_WAIT_COMPLETION(a)        IFXOS_ThreadShutdown((a), 3000)
-#define DSL_DRV_THREAD_DELETE(a, b)       ((void)0)
-
-#define DSL_DRV_CRLF "\n"
-
-/*
-   System Time Get
-*/
-DSL_uint32_t DSL_DRV_SysTimeGet(DSL_uint32_t nOffset);
-
-/*
-   DSL CPE API driver Device Create
-*/
-DSL_int_t DSL_DRV_SIM_DeviceCreate(DSL_void_t);
-
-/*
-   DSL CPE API driver Device Delete
-*/
-DSL_void_t DSL_DRV_SIM_DeviceDelete(DSL_void_t);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/include/drv_dsl_cpe_procfs_linux.h b/src/include/drv_dsl_cpe_procfs_linux.h
deleted file mode 100644
index 11a6b39f935026959db0c7e0fc880ed8e33f3dc7..0000000000000000000000000000000000000000
--- a/src/include/drv_dsl_cpe_procfs_linux.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/******************************************************************************
-
-                          Copyright (c) 2007-2015
-                     Lantiq Beteiligungs-GmbH & Co. KG
-
-  For licensing information, see the file 'LICENSE' in the root folder of
-  this software module.
-
-******************************************************************************/
-
-#ifndef _DRV_DSL_CPE_PROCFS_LINUX_H
-#define _DRV_DSL_CPE_PROCFS_LINUX_H
-
-#ifdef DSL_INTERN
-
-#include "drv_dsl_cpe_api.h"
-
-#ifndef _lint
-#include "drv_dsl_cpe_os_linux.h"
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#else
-#include "drv_dsl_cpe_os_lint_map.h"
-#endif /* #ifndef _lint*/
-
-#ifdef __cplusplus
-   extern "C" {
-#endif
-
-#ifdef INCLUDE_DSL_CPE_PROCFILES
-
-#define DSL_DRV_PROC_ENTRY_ADD(name, pFshow, pFget, bDevSpecific) \
-   {name, pFshow, pFget, bDevSpecific, {{0}}}
-
-typedef enum
-{
-   /* Format as hey values */
-   DSL_ARRAY_FORMAT_HEX,
-   /* Format as string */
-    DSL_ARRAY_FORMAT_STRING
-} DSL_DRV_ArrayPrintFormat_t;
-
-typedef DSL_int_t (*DSL_DRV_PROC_EntryShow_t)(struct seq_file*);
-typedef DSL_void_t * (*DSL_DRV_PROC_EntryDataGet_t)(struct seq_file*);
-
-typedef struct proc_dir_entry DSL_DRV_PROC_DirEntry_t;
-
-typedef struct
-{
-   /**
-   Iteration number*/
-   DSL_uint32_t v;
-   /**
-   Sequence end flag*/
-   DSL_boolean_t bEnd;
-   /**
-   Private entry data*/
-   DSL_void_t *pPrivateData;
-   /**
-   Printout data pointer*/
-   DSL_void_t *pPrintData;
-} DSL_DRV_PROC_SecFilePrivateData_t;
-
-typedef struct
-{
-   /**
-   device number*/
-   DSL_int_t devNum;
-   /**
-   proc entry SHOW handler*/
-   DSL_DRV_PROC_EntryShow_t    pProcShow;
-   /**
-   proc entry DATA handler*/
-   DSL_DRV_PROC_EntryDataGet_t pProcDataGet;
-   DSL_DRV_PROC_SecFilePrivateData_t SecPrivateData;
-} DSL_DRV_PROC_EntryData_t;
-
-typedef struct
-{
-   /**
-   proc entry string identifier*/
-   const DSL_char_t * const string;
-   /**
-   proc entry handler*/
-   DSL_DRV_PROC_EntryShow_t    const pProcShow;
-   DSL_DRV_PROC_EntryDataGet_t const pProcDataGet;
-   /**
-   is entry device specific*/
-   const DSL_boolean_t bDevSpecific;
-   /**
-   device proc entry data, data which is passed to the "read_proc" system call*/
-   DSL_DRV_PROC_EntryData_t entryData[DSL_DRV_MAX_ENTITIES];
-} DSL_DRV_PROC_EntryTable_t;
-
-extern DSL_DRV_PROC_EntryTable_t procEntryTable[];
-
-#ifndef SWIG
-DSL_int_t DSL_DRV_InstallProcEntry(DSL_void_t);
-#endif /* SWIG */
-
-#ifndef SWIG
-DSL_int_t DSL_DRV_RemoveProcEntry(DSL_void_t);
-#endif /* SWIG */
-
-#endif /* #ifdef INCLUDE_DSL_CPE_PROCFILES*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* DSL_INTERN*/
-
-#endif /* _DRV_DSL_CPE_PROCFS_LINUX_H*/
diff --git a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_config_pmd.h b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_config_pmd.h
similarity index 93%
rename from src/include/mcat3.1/drv_dsl_cpe_vrx_msg_config_pmd.h
rename to src/include/mcat3.2/drv_dsl_cpe_vrx_msg_config_pmd.h
index ec850d71210f195901bf44a5d01c1acf1d78901b..93646de619b88ebfb023dc598808816887a04ffa 100644
--- a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_config_pmd.h
+++ b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_config_pmd.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                            Copyright (c) 2007-2017
-                       Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2018 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.
@@ -111,8 +113,9 @@
 #define ALM_ModemFSM_FailReasonGet_S_INTENDED_LOCAL_SHUTDOWN 0x26
 #define ALM_ModemFSM_FailReasonGet_S_HW 0x27
 #define ALM_ModemFSM_FailReasonGet_S_CALIBRATION 0x28
-#define ALM_ModemFSM_FailReasonGet_S_PP_CLOCK_NEW 0x29
+#define ALM_ModemFSM_FailReasonGet_S_AUTOMSG 0x29
 #define ALM_ModemFSM_FailReasonGet_S_PP_ERB_INIT 0x2A
+#define ALM_ModemFSM_FailReasonGet_S_REBOOT_REQ 0x2B
 #define ALM_ModemFSM_FailReasonGet_E_OK 0x0
 #define ALM_ModemFSM_FailReasonGet_E_CONFIG 0x1
 #define ALM_ModemFSM_FailReasonGet_E_NOTFEASIBLE 0x2
@@ -152,8 +155,9 @@
 #define ACK_ModemFSM_FailReasonGet_S_INTENDED_LOCAL_SHUTDOWN 0x26
 #define ACK_ModemFSM_FailReasonGet_S_HW 0x27
 #define ACK_ModemFSM_FailReasonGet_S_CALIBRATION 0x28
-#define ACK_ModemFSM_FailReasonGet_S_PP_CLOCK_NEW 0x29
+#define ACK_ModemFSM_FailReasonGet_S_AUTOMSG 0x29
 #define ACK_ModemFSM_FailReasonGet_S_PP_ERB_INIT 0x2A
+#define ACK_ModemFSM_FailReasonGet_S_REBOOT_REQ 0x2B
 #define ACK_ModemFSM_FailReasonGet_E_OK 0x0
 #define ACK_ModemFSM_FailReasonGet_E_CONFIG 0x1
 #define ACK_ModemFSM_FailReasonGet_E_NOTFEASIBLE 0x2
@@ -230,7 +234,8 @@
 #define CMD_OperatorSelect_TELCO_SWISSCOM 15
 #define CMD_OperatorSelect_TELCO_NETGEAR 16
 #define CMD_OperatorSelect_TELCO_CTL 17
-#define CMD_OperatorSelect_TELCO_TI 17
+#define CMD_OperatorSelect_TELCO_TI 18
+#define CMD_OperatorSelect_TELCO_MAGYAR 19
 #define ACK_OperatorSelectionGet_TELCO_OFF 0
 #define ACK_OperatorSelectionGet_TELCO_DTAG 1
 #define ACK_OperatorSelectionGet_TELCO_BT 2
@@ -249,22 +254,20 @@
 #define ACK_OperatorSelectionGet_TELCO_SWISSCOM 15
 #define ACK_OperatorSelectionGet_TELCO_NETGEAR 16
 #define ACK_OperatorSelectionGet_TELCO_CTL 17
+#define ACK_OperatorSelectionGet_TELCO_TI 18
+#define ACK_OperatorSelectionGet_TELCO_MAGYAR 19
 #define CMD_ClockSet_M1 1
 #define CMD_ClockSet_M2 2
 #define CMD_ClockSet_M3 3
 #define CMD_ClockSet_M4 4
 #define CMD_PPE_ClockConfigure_FSCALE_AUTO_OFF 0
 #define CMD_PPE_ClockConfigure_FSCALE_AUTO_A 1
-#define CMD_PPE_ClockConfigure_FSCALE_AUTO_B 2
-#define CMD_PPE_ClockConfigure_FSCALE_AUTO_C 3
 #define ACK_PPE_ClockGet_M1 1
 #define ACK_PPE_ClockGet_M2 2
 #define ACK_PPE_ClockGet_M3 3
 #define ACK_PPE_ClockGet_M4 4
 #define ACK_PPE_ClockConfigGet_FSCALE_AUTO_OFF 0
 #define ACK_PPE_ClockConfigGet_FSCALE_AUTO_A 1
-#define ACK_PPE_ClockConfigGet_FSCALE_AUTO_B 2
-#define ACK_PPE_ClockConfigGet_FSCALE_AUTO_C 3
 /* ----- Message Specific Constants Definition section (End) ----- */
 
 /** Message ID for CMD_ModemFSM_StateGet */
@@ -351,6 +354,40 @@ typedef struct CMD_ModemFSM_FailReasonGet CMD_ModemFSM_FailReasonGet_t;
 */
 typedef struct ACK_ModemFSM_FailReasonGet ACK_ModemFSM_FailReasonGet_t;
 
+/** Message ID for CMD_ModemFSM_PrevFailReasonGet */
+#define CMD_MODEMFSM_PREVFAILREASONGET 0x2522
+
+/**
+   Requests failure information of the last previous FAIL state.
+*/
+typedef struct CMD_ModemFSM_PrevFailReasonGet CMD_ModemFSM_PrevFailReasonGet_t;
+
+/** Message ID for ACK_ModemFSM_PrevFailReasonGet */
+#define ACK_MODEMFSM_PREVFAILREASONGET 0x2522
+
+/**
+   Returns failure information from last previous FAIL state. The message
+   structure is the same as ACK_ModemFSM_FailReasonGet (used for the current
+   FAIL state.)
+*/
+typedef struct ACK_ModemFSM_PrevFailReasonGet ACK_ModemFSM_PrevFailReasonGet_t;
+
+/** Message ID for CMD_FailReasonHistoryGet */
+#define CMD_FAILREASONHISTORYGET 0x2622
+
+/**
+   Requests a failure reason history of the last few transitions to FAIL state.
+*/
+typedef struct CMD_FailReasonHistoryGet CMD_FailReasonHistoryGet_t;
+
+/** Message ID for ACK_FailReasonHistoryGet */
+#define ACK_FAILREASONHISTORYGET 0x2622
+
+/**
+   Provides a failure reason history of the last few transitions to FAIL state.
+*/
+typedef struct ACK_FailReasonHistoryGet ACK_FailReasonHistoryGet_t;
+
 /** Message ID for CMD_ModemFSM_OptionsSet */
 #define CMD_MODEMFSM_OPTIONSSET 0x0449
 
@@ -976,8 +1013,8 @@ typedef struct ACK_ClockSet ACK_ClockSet_t;
 /**
    Configures PPE clock options.The message CMD_ClockSet used for debug/test
    purposes forces a PPE clock frequency which will be kept throughout the
-   link.. The PPE frequency scaling automode (see CMD_ClockSet) will then not
-   change it but behave as being disabled.
+   link.. The PPE frequency scaling automode will then not change it but behave
+   as being disabled.
 */
 typedef struct CMD_PPE_ClockConfigure CMD_PPE_ClockConfigure_t;
 
@@ -1318,6 +1355,164 @@ struct ACK_ModemFSM_FailReasonGet
 } __PACKED__ ;
 
 
+/**
+   Requests failure information of the last previous FAIL state.
+*/
+struct CMD_ModemFSM_PrevFailReasonGet
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#endif
+} __PACKED__ ;
+
+
+/**
+   Returns failure information from last previous FAIL state. The message
+   structure is the same as ACK_ModemFSM_FailReasonGet (used for the current
+   FAIL state.)
+*/
+struct ACK_ModemFSM_PrevFailReasonGet
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** System Sub Error Code */
+   DSL_uint8_t SubErrorCode;
+   /** System Error Code */
+   DSL_uint8_t ErrorCode;
+   /** Failure State Information */
+   DSL_uint16_t FW_FailCode;
+   /** Reserved */
+   DSL_uint16_t Res0[8];
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** System Error Code */
+   DSL_uint8_t ErrorCode;
+   /** System Sub Error Code */
+   DSL_uint8_t SubErrorCode;
+   /** Failure State Information */
+   DSL_uint16_t FW_FailCode;
+   /** Reserved */
+   DSL_uint16_t Res0[8];
+#endif
+} __PACKED__ ;
+
+
+/**
+   Requests a failure reason history of the last few transitions to FAIL state.
+*/
+struct CMD_FailReasonHistoryGet
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#endif
+} __PACKED__ ;
+
+
+/**
+   Provides a failure reason history of the last few transitions to FAIL state.
+*/
+struct ACK_FailReasonHistoryGet
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** System Sub Error Code of 1st Previous Fail State */
+   DSL_uint8_t SubErrorCode1;
+   /** System Error Code of Previous Fail State */
+   DSL_uint8_t ErrorCode1;
+   /** FW Fail Code of of Previous Fail State */
+   DSL_uint16_t FW_FailCode1;
+   /** System Sub Error Code of 2nd Previous Fail State */
+   DSL_uint8_t SubErrorCode2;
+   /** System Error Code of 2nd Previous Fail State */
+   DSL_uint8_t ErrorCode2;
+   /** FW Fail Code of of 2nd Previous Fail State */
+   DSL_uint16_t FW_FailCode2;
+   /** System Sub Error Code of 3rd Previous Fail State */
+   DSL_uint8_t SubErrorCode3;
+   /** System Error Code of 3rd Previous Fail State */
+   DSL_uint8_t ErrorCode3;
+   /** FW Fail Code of of 3rd Previous Fail State */
+   DSL_uint16_t FW_FailCode3;
+   /** System Sub Error Code of 4th Previous Fail State */
+   DSL_uint8_t SubErrorCode4;
+   /** System Error Code of 4th Previous Fail State */
+   DSL_uint8_t ErrorCode4;
+   /** FW Fail Code of of 4th Previous Fail State */
+   DSL_uint16_t FW_FailCode4;
+   /** System Sub Error Code of 5th Previous Fail State */
+   DSL_uint8_t SubErrorCode5;
+   /** System Error Code of 5th Previous Fail State */
+   DSL_uint8_t ErrorCode5;
+   /** FW Fail Code of of 5thPrevious Fail State */
+   DSL_uint16_t FW_FailCode5;
+   /** Reserved */
+   DSL_uint16_t Res0[8];
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** System Error Code of Previous Fail State */
+   DSL_uint8_t ErrorCode1;
+   /** System Sub Error Code of 1st Previous Fail State */
+   DSL_uint8_t SubErrorCode1;
+   /** FW Fail Code of of Previous Fail State */
+   DSL_uint16_t FW_FailCode1;
+   /** System Error Code of 2nd Previous Fail State */
+   DSL_uint8_t ErrorCode2;
+   /** System Sub Error Code of 2nd Previous Fail State */
+   DSL_uint8_t SubErrorCode2;
+   /** FW Fail Code of of 2nd Previous Fail State */
+   DSL_uint16_t FW_FailCode2;
+   /** System Error Code of 3rd Previous Fail State */
+   DSL_uint8_t ErrorCode3;
+   /** System Sub Error Code of 3rd Previous Fail State */
+   DSL_uint8_t SubErrorCode3;
+   /** FW Fail Code of of 3rd Previous Fail State */
+   DSL_uint16_t FW_FailCode3;
+   /** System Error Code of 4th Previous Fail State */
+   DSL_uint8_t ErrorCode4;
+   /** System Sub Error Code of 4th Previous Fail State */
+   DSL_uint8_t SubErrorCode4;
+   /** FW Fail Code of of 4th Previous Fail State */
+   DSL_uint16_t FW_FailCode4;
+   /** System Error Code of 5th Previous Fail State */
+   DSL_uint8_t ErrorCode5;
+   /** System Sub Error Code of 5th Previous Fail State */
+   DSL_uint8_t SubErrorCode5;
+   /** FW Fail Code of of 5thPrevious Fail State */
+   DSL_uint16_t FW_FailCode5;
+   /** Reserved */
+   DSL_uint16_t Res0[8];
+#endif
+} __PACKED__ ;
+
+
 /**
    Configuration of options for the modem state machine.
 */
@@ -3664,8 +3859,8 @@ struct ACK_ClockSet
 /**
    Configures PPE clock options.The message CMD_ClockSet used for debug/test
    purposes forces a PPE clock frequency which will be kept throughout the
-   link.. The PPE frequency scaling automode (see CMD_ClockSet) will then not
-   change it but behave as being disabled.
+   link.. The PPE frequency scaling automode will then not change it but behave
+   as being disabled.
 */
 struct CMD_PPE_ClockConfigure
 {
diff --git a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_const.h b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_const.h
similarity index 97%
rename from src/include/mcat3.1/drv_dsl_cpe_vrx_msg_const.h
rename to src/include/mcat3.2/drv_dsl_cpe_vrx_msg_const.h
index 9803f2290e130d1d073c2bc002502b57ccaf249d..d659aff8de9aaf52053962b08afb0b0dc0de7fcc 100644
--- a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_const.h
+++ b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_const.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                            Copyright (c) 2007-2017
-                       Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2018 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.
@@ -96,6 +98,8 @@
 #define FV20 20
 /** Fixed Value of 32; Used for numbering parameters (like Array Index number or Length number) */
 #define FV32 32
+/** Fixed Value of 64; Used for numbering parameters (like Array Index number or Length number) */
+#define FV64 64
 /** Fixed Value of 127; Used for numbering parameters (like Array Index number or Length number) */
 #define FV127 127
 /** Fixed Value of 128; Used for numbering parameters (like Array Index number or Length number) */
diff --git a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_dmt_scope.h b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_dmt_scope.h
similarity index 98%
rename from src/include/mcat3.1/drv_dsl_cpe_vrx_msg_dmt_scope.h
rename to src/include/mcat3.2/drv_dsl_cpe_vrx_msg_dmt_scope.h
index c8822230a17c4038542781972abe465f49472ee9..f6be51a153968bbec7de0eb87b69266495c97880 100644
--- a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_dmt_scope.h
+++ b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_dmt_scope.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                            Copyright (c) 2007-2017
-                       Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2018 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.
diff --git a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_ghs_status.h b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_ghs_status.h
similarity index 99%
rename from src/include/mcat3.1/drv_dsl_cpe_vrx_msg_ghs_status.h
rename to src/include/mcat3.2/drv_dsl_cpe_vrx_msg_ghs_status.h
index 737930b8e8c64b11f37a676b9bb55b0430d01132..6f138e5c5729556cb0096130d8418bc863170550 100644
--- a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_ghs_status.h
+++ b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_ghs_status.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                            Copyright (c) 2007-2017
-                       Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2018 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.
@@ -3367,11 +3369,17 @@ struct ACK_LineStatusDS_Get
    /** Virtual Noise Status DS */
    DSL_uint16_t VNstatus_ds : 1;
    /** Reserved */
-   DSL_uint16_t Res2 : 6;
+   DSL_uint16_t Res2 : 5;
+   /** ROC Status DS */
+   DSL_uint16_t ROCstatus_ds : 1;
    /** NTR Status DS */
    DSL_uint16_t NTRstatus_ds : 1;
    /** TCM Status DS */
    DSL_uint16_t TCMstatus_ds : 1;
+   /** Reserved */
+   DSL_uint16_t Res3;
+   /** Downstream SNRM-ROC (VDSL only) */
+   DSL_uint16_t SNRM_ROCds;
 #else
    /** Index */
    DSL_uint16_t Index;
@@ -3397,12 +3405,18 @@ struct ACK_LineStatusDS_Get
    DSL_uint16_t TCMstatus_ds : 1;
    /** NTR Status DS */
    DSL_uint16_t NTRstatus_ds : 1;
+   /** ROC Status DS */
+   DSL_uint16_t ROCstatus_ds : 1;
    /** Reserved */
-   DSL_uint16_t Res2 : 6;
+   DSL_uint16_t Res2 : 5;
    /** Virtual Noise Status DS */
    DSL_uint16_t VNstatus_ds : 1;
    /** Reserved */
    DSL_uint16_t Res1 : 7;
+   /** Reserved */
+   DSL_uint16_t Res3;
+   /** Downstream SNRM-ROC (VDSL only) */
+   DSL_uint16_t SNRM_ROCds;
 #endif
 } __PACKED__ ;
 
@@ -3459,9 +3473,17 @@ struct ACK_LineStatusUS_Get
    /** Virtual Noise Status US */
    DSL_uint16_t VNstatus_us : 1;
    /** Reserved */
-   DSL_uint16_t Res2 : 7;
+   DSL_uint16_t Res2 : 5;
+   /** ROC Status US */
+   DSL_uint16_t ROCstatus_us : 1;
+   /** Reserved */
+   DSL_uint16_t Res3 : 1;
    /** TCM Status US */
    DSL_uint16_t TCMstatus_us : 1;
+   /** ERB BDR US */
+   DSL_uint16_t BDRus;
+   /** Upstream SNRM-ROC (VDSL only) */
+   DSL_uint16_t SNRM_ROCus;
 #else
    /** Index */
    DSL_uint16_t Index;
@@ -3486,11 +3508,19 @@ struct ACK_LineStatusUS_Get
    /** TCM Status US */
    DSL_uint16_t TCMstatus_us : 1;
    /** Reserved */
-   DSL_uint16_t Res2 : 7;
+   DSL_uint16_t Res3 : 1;
+   /** ROC Status US */
+   DSL_uint16_t ROCstatus_us : 1;
+   /** Reserved */
+   DSL_uint16_t Res2 : 5;
    /** Virtual Noise Status US */
    DSL_uint16_t VNstatus_us : 1;
    /** Reserved */
    DSL_uint16_t Res1 : 7;
+   /** ERB BDR US */
+   DSL_uint16_t BDRus;
+   /** Upstream SNRM-ROC (VDSL only) */
+   DSL_uint16_t SNRM_ROCus;
 #endif
 } __PACKED__ ;
 
diff --git a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_olr.h b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_olr.h
similarity index 94%
rename from src/include/mcat3.1/drv_dsl_cpe_vrx_msg_olr.h
rename to src/include/mcat3.2/drv_dsl_cpe_vrx_msg_olr.h
index 582845b31be4177886ca2cb6624b274ea17f740c..b3ee46c6df86e5ad19c1796ab9df088b5b22791f 100644
--- a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_olr.h
+++ b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_olr.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                            Copyright (c) 2007-2017
-                       Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2018 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.
@@ -119,7 +121,7 @@ typedef struct ACK_GainTableEntriesGet ACK_GainTableEntriesGet_t;
    noise for the near-end side , which means for downstream direction at the
    CPE. It is the hosts responsibility to select the tone indices
    accordingly.See also Table 20 "How to Retrieve Test Parameter Data" on Page
-   496.
+   511.
 */
 typedef struct CMD_SNR_NE_TableEntriesGet CMD_SNR_NE_TableEntriesGet_t;
 
@@ -607,7 +609,7 @@ typedef struct EVT_ClearEOCStatusGet EVT_ClearEOCStatusGet_t;
    The message is used to reset the transmit or receive status of the clear eoc
    data transmission to IDLE (for defined states see also
    CMD_ClearEOCStatusGet). See the description on the Clear EOC handling on Page
-   540 for when it has to be applied. Transmit and receive status are
+   555 for when it has to be applied. Transmit and receive status are
    distinguished by the Index parameter.
 */
 typedef struct CMD_ClearEOCStatusSet CMD_ClearEOCStatusSet_t;
@@ -652,6 +654,38 @@ typedef struct CMD_OH_StatsGet CMD_OH_StatsGet_t;
 */
 typedef struct ACK_OH_StatsGet ACK_OH_StatsGet_t;
 
+/** Message ID for CMD_RRC_ROC_Tones_DS_Get */
+#define CMD_RRC_ROC_TONES_DS_GET 0xF703
+
+/**
+   Requests RRC and ROC downstream tones for VDSL2 operated in RTX mode.
+*/
+typedef struct CMD_RRC_ROC_Tones_DS_Get CMD_RRC_ROC_Tones_DS_Get_t;
+
+/** Message ID for ACK_RRC_ROC_Tones_DS_Get */
+#define ACK_RRC_ROC_TONES_DS_GET 0xF703
+
+/**
+   Provides RRC and ROC downstream tones for VDSL2 operated in RTX mode.
+*/
+typedef struct ACK_RRC_ROC_Tones_DS_Get ACK_RRC_ROC_Tones_DS_Get_t;
+
+/** Message ID for CMD_RRC_ROC_Tones_US_Get */
+#define CMD_RRC_ROC_TONES_US_GET 0xF803
+
+/**
+   Requests RRC and ROC upstream tones for VDSL2 operated in RTX mode.
+*/
+typedef struct CMD_RRC_ROC_Tones_US_Get CMD_RRC_ROC_Tones_US_Get_t;
+
+/** Message ID for ACK_RRC_ROC_Tones_US_Get */
+#define ACK_RRC_ROC_TONES_US_GET 0xF803
+
+/**
+   Provides RRC and ROC upstream tones for VDSL2 operated in RTX mode.
+*/
+typedef struct ACK_RRC_ROC_Tones_US_Get ACK_RRC_ROC_Tones_US_Get_t;
+
 /** Message ID for CMD_OLR_Control */
 #define CMD_OLR_CONTROL 0x0F45
 
@@ -1112,7 +1146,7 @@ struct ACK_GainTableEntriesGet
    noise for the near-end side , which means for downstream direction at the
    CPE. It is the hosts responsibility to select the tone indices
    accordingly.See also Table 20 "How to Retrieve Test Parameter Data" on Page
-   496.
+   511.
 */
 struct CMD_SNR_NE_TableEntriesGet
 {
@@ -2379,7 +2413,7 @@ struct EVT_ClearEOCStatusGet
    The message is used to reset the transmit or receive status of the clear eoc
    data transmission to IDLE (for defined states see also
    CMD_ClearEOCStatusGet). See the description on the Clear EOC handling on Page
-   540 for when it has to be applied. Transmit and receive status are
+   555 for when it has to be applied. Transmit and receive status are
    distinguished by the Index parameter.
 */
 struct CMD_ClearEOCStatusSet
@@ -2541,6 +2575,114 @@ struct ACK_OH_StatsGet
 } __PACKED__ ;
 
 
+/**
+   Requests RRC and ROC downstream tones for VDSL2 operated in RTX mode.
+*/
+struct CMD_RRC_ROC_Tones_DS_Get
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#endif
+} __PACKED__ ;
+
+
+/**
+   Provides RRC and ROC downstream tones for VDSL2 operated in RTX mode.
+*/
+struct ACK_RRC_ROC_Tones_DS_Get
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** Last RRC Tone DS */
+   DSL_uint16_t LastRrcTone;
+   /** First ROC Tone DS */
+   DSL_uint16_t FirstRocTone;
+   /** Last ROC Tone DS */
+   DSL_uint16_t LastRocTone;
+   /** RRC/ROC Tone Index Array DS */
+   DSL_uint16_t RrcRocTone[61];
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** Last RRC Tone DS */
+   DSL_uint16_t LastRrcTone;
+   /** First ROC Tone DS */
+   DSL_uint16_t FirstRocTone;
+   /** Last ROC Tone DS */
+   DSL_uint16_t LastRocTone;
+   /** RRC/ROC Tone Index Array DS */
+   DSL_uint16_t RrcRocTone[61];
+#endif
+} __PACKED__ ;
+
+
+/**
+   Requests RRC and ROC upstream tones for VDSL2 operated in RTX mode.
+*/
+struct CMD_RRC_ROC_Tones_US_Get
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#endif
+} __PACKED__ ;
+
+
+/**
+   Provides RRC and ROC upstream tones for VDSL2 operated in RTX mode.
+*/
+struct ACK_RRC_ROC_Tones_US_Get
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** Last RRC Tone US */
+   DSL_uint16_t LastRrcTone;
+   /** First ROC Tone US */
+   DSL_uint16_t FirstRocTone;
+   /** Last ROC Tone US */
+   DSL_uint16_t LastRocTone;
+   /** RRC/ROC Tone Index Array US */
+   DSL_uint16_t RrcRocTone[61];
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** Last RRC Tone US */
+   DSL_uint16_t LastRrcTone;
+   /** First ROC Tone US */
+   DSL_uint16_t FirstRocTone;
+   /** Last ROC Tone US */
+   DSL_uint16_t LastRocTone;
+   /** RRC/ROC Tone Index Array US */
+   DSL_uint16_t RrcRocTone[61];
+#endif
+} __PACKED__ ;
+
+
 /**
    Enables/Disables support for OLR events (Bitswaps, SRA, SOS, ROC).An OLR
    transition is always initiated by the receiving PMD, so the CPE requests the
@@ -2555,10 +2697,10 @@ struct CMD_OLR_Control
    DSL_uint16_t Length;
    /** Reserved */
    DSL_uint16_t Res0 : 4;
-   /** ROC DS */
-   DSL_uint16_t ROC_DS : 1;
-   /** ROC US */
-   DSL_uint16_t ROC_US : 1;
+   /** RX Bitswap ROC */
+   DSL_uint16_t RxBitswap_ROC : 1;
+   /** TX Bitswap ROC */
+   DSL_uint16_t TxBitswap_ROC : 1;
    /** SOS DS */
    DSL_uint16_t SOS_DS : 1;
    /** SOS US */
@@ -2604,10 +2746,10 @@ struct CMD_OLR_Control
    DSL_uint16_t SOS_US : 1;
    /** SOS DS */
    DSL_uint16_t SOS_DS : 1;
-   /** ROC US */
-   DSL_uint16_t ROC_US : 1;
-   /** ROC DS */
-   DSL_uint16_t ROC_DS : 1;
+   /** TX Bitswap ROC */
+   DSL_uint16_t TxBitswap_ROC : 1;
+   /** RX Bitswap ROC */
+   DSL_uint16_t RxBitswap_ROC : 1;
    /** Reserved */
    DSL_uint16_t Res0 : 4;
 #endif
@@ -2674,18 +2816,26 @@ struct ACK_OLR_US_StatsGet
    DSL_uint16_t BitswapsDone;
    /** Reserved */
    DSL_uint16_t Res0;
-   /** Reserved for DRR */
-   DSL_uint16_t Res1[5];
+   /** US SOS Requests */
+   DSL_uint16_t SOS_Reqs;
+   /** Reserved */
+   DSL_uint16_t Res1;
+   /** US SOS UTC Responses */
+   DSL_uint16_t SOS_UTCs;
+   /** US "SOS Performed" Count */
+   DSL_uint16_t SOS_Done;
+   /** Reserved */
+   DSL_uint16_t Res2;
    /** US SRA Requests */
    DSL_uint16_t SRA_Reqs;
    /** Reserved */
-   DSL_uint16_t Res2;
+   DSL_uint16_t Res3;
    /** US SRA UTC Responses */
    DSL_uint16_t SRA_UTCs;
    /** US "SRA Performed" Count */
    DSL_uint16_t SRAsDone;
    /** Reserved */
-   DSL_uint16_t Res3;
+   DSL_uint16_t Res4;
 #else
    /** Index */
    DSL_uint16_t Index;
@@ -2701,18 +2851,26 @@ struct ACK_OLR_US_StatsGet
    DSL_uint16_t BitswapsDone;
    /** Reserved */
    DSL_uint16_t Res0;
-   /** Reserved for DRR */
-   DSL_uint16_t Res1[5];
+   /** US SOS Requests */
+   DSL_uint16_t SOS_Reqs;
+   /** Reserved */
+   DSL_uint16_t Res1;
+   /** US SOS UTC Responses */
+   DSL_uint16_t SOS_UTCs;
+   /** US "SOS Performed" Count */
+   DSL_uint16_t SOS_Done;
+   /** Reserved */
+   DSL_uint16_t Res2;
    /** US SRA Requests */
    DSL_uint16_t SRA_Reqs;
    /** Reserved */
-   DSL_uint16_t Res2;
+   DSL_uint16_t Res3;
    /** US SRA UTC Responses */
    DSL_uint16_t SRA_UTCs;
    /** US "SRA Performed" Count */
    DSL_uint16_t SRAsDone;
    /** Reserved */
-   DSL_uint16_t Res3;
+   DSL_uint16_t Res4;
 #endif
 } __PACKED__ ;
 
@@ -2758,8 +2916,16 @@ struct ACK_OLR_DS_StatsGet
    DSL_uint16_t BitswapsDone;
    /** DS Bitswap Timeouts */
    DSL_uint16_t BitswapTimeOuts;
-   /** Reserved for DRR */
-   DSL_uint16_t Res0[5];
+   /** DS SOS Requests */
+   DSL_uint16_t SOS_Reqs;
+   /** Reserved */
+   DSL_uint16_t Res0;
+   /** DS SOS UTC Responses */
+   DSL_uint16_t SOS_UTCs;
+   /** DS "SOS Performed" Count */
+   DSL_uint16_t SOS_Done;
+   /** DS SOS Timeouts */
+   DSL_uint16_t SOS_TimeOuts;
    /** DS SRA Requests */
    DSL_uint16_t SRA_Reqs;
    /** Reserved */
@@ -2770,16 +2936,6 @@ struct ACK_OLR_DS_StatsGet
    DSL_uint16_t SRAsDone;
    /** DS SRA Timeouts */
    DSL_uint16_t SRA_TimeOuts;
-   /** DS SOS Requests */
-   DSL_uint16_t SOS_Reqs;
-   /** Reserved */
-   DSL_uint16_t Res2;
-   /** DS SOS UTC Responses */
-   DSL_uint16_t SOS_UTCs;
-   /** DS "SOS Performed" Count */
-   DSL_uint16_t SOS_Done;
-   /** DS SOS Timeouts */
-   DSL_uint16_t SOS_TimeOuts;
 #else
    /** Index */
    DSL_uint16_t Index;
@@ -2795,8 +2951,16 @@ struct ACK_OLR_DS_StatsGet
    DSL_uint16_t BitswapsDone;
    /** DS Bitswap Timeouts */
    DSL_uint16_t BitswapTimeOuts;
-   /** Reserved for DRR */
-   DSL_uint16_t Res0[5];
+   /** DS SOS Requests */
+   DSL_uint16_t SOS_Reqs;
+   /** Reserved */
+   DSL_uint16_t Res0;
+   /** DS SOS UTC Responses */
+   DSL_uint16_t SOS_UTCs;
+   /** DS "SOS Performed" Count */
+   DSL_uint16_t SOS_Done;
+   /** DS SOS Timeouts */
+   DSL_uint16_t SOS_TimeOuts;
    /** DS SRA Requests */
    DSL_uint16_t SRA_Reqs;
    /** Reserved */
@@ -2807,16 +2971,6 @@ struct ACK_OLR_DS_StatsGet
    DSL_uint16_t SRAsDone;
    /** DS SRA Timeouts */
    DSL_uint16_t SRA_TimeOuts;
-   /** DS SOS Requests */
-   DSL_uint16_t SOS_Reqs;
-   /** Reserved */
-   DSL_uint16_t Res2;
-   /** DS SOS UTC Responses */
-   DSL_uint16_t SOS_UTCs;
-   /** DS "SOS Performed" Count */
-   DSL_uint16_t SOS_Done;
-   /** DS SOS Timeouts */
-   DSL_uint16_t SOS_TimeOuts;
 #endif
 } __PACKED__ ;
 
@@ -3089,7 +3243,11 @@ struct CMD_RTX_Control
    /** Length */
    DSL_uint16_t Length;
    /** Reserved */
-   DSL_uint16_t Res0 : 6;
+   DSL_uint16_t Res0 : 4;
+   /** ROC US */
+   DSL_uint16_t ROC_US : 1;
+   /** ROC DS */
+   DSL_uint16_t ROC_DS : 1;
    /** Extended Memory for Enhanced Bit Rates (Anx D support, VDSL only) */
    DSL_uint16_t ExtMem : 1;
    /** Force Extended Memory for Enhanced Bit Rates (VDSL only) */
@@ -3123,8 +3281,12 @@ struct CMD_RTX_Control
    DSL_uint16_t ExtMemForced : 1;
    /** Extended Memory for Enhanced Bit Rates (Anx D support, VDSL only) */
    DSL_uint16_t ExtMem : 1;
+   /** ROC DS */
+   DSL_uint16_t ROC_DS : 1;
+   /** ROC US */
+   DSL_uint16_t ROC_US : 1;
    /** Reserved */
-   DSL_uint16_t Res0 : 6;
+   DSL_uint16_t Res0 : 4;
 #endif
 } __PACKED__ ;
 
@@ -3515,6 +3677,26 @@ struct ACK_RTX_US_StatsGet
    DSL_uint16_t RxDtuNoCorr_LSW;
    /** RxDtuUncorrected Count (rtx-uc), MSW */
    DSL_uint16_t RxDtuNoCorr_MSW;
+   /** TxDtuRetransmitted On OLR Count, LSW */
+   DSL_uint16_t TxDtuRTXOlr_LSW;
+   /** TxDtuRetransmitted On OLR Count, MSW */
+   DSL_uint16_t TxDtuRTXOlr_MSW;
+   /** TxDtuRetransmitted On NACK Count, LSW */
+   DSL_uint16_t TxDtuRTXNACK_LSW;
+   /** TxDtuRetransmitted On NACK Count, MSW */
+   DSL_uint16_t TxDtuRTXNACK_MSW;
+   /** TxDtuRetransmitted On Timeout Count, LSW */
+   DSL_uint16_t TxDtuRTXTimeout_LSW;
+   /** TxDtuRetransmitted On Timeout Count, LSW */
+   DSL_uint16_t TxDtuRTXTimeout_MSW;
+   /** Uncorrected Rx RRC CW Count, LSW */
+   DSL_uint16_t GolayErr_LSW;
+   /** Uncorrected Rx RRC CW Count, LSW */
+   DSL_uint16_t GolayErr_MSW;
+   /** Roundtrip Error Count, LSW */
+   DSL_uint16_t RoundtripErr_LSW;
+   /** Roundtrip Error Count, MSW */
+   DSL_uint16_t RoundtripErr_MSW;
 #else
    /** Index */
    DSL_uint16_t Index;
@@ -3532,6 +3714,26 @@ struct ACK_RTX_US_StatsGet
    DSL_uint16_t RxDtuNoCorr_LSW;
    /** RxDtuUncorrected Count (rtx-uc), MSW */
    DSL_uint16_t RxDtuNoCorr_MSW;
+   /** TxDtuRetransmitted On OLR Count, LSW */
+   DSL_uint16_t TxDtuRTXOlr_LSW;
+   /** TxDtuRetransmitted On OLR Count, MSW */
+   DSL_uint16_t TxDtuRTXOlr_MSW;
+   /** TxDtuRetransmitted On NACK Count, LSW */
+   DSL_uint16_t TxDtuRTXNACK_LSW;
+   /** TxDtuRetransmitted On NACK Count, MSW */
+   DSL_uint16_t TxDtuRTXNACK_MSW;
+   /** TxDtuRetransmitted On Timeout Count, LSW */
+   DSL_uint16_t TxDtuRTXTimeout_LSW;
+   /** TxDtuRetransmitted On Timeout Count, LSW */
+   DSL_uint16_t TxDtuRTXTimeout_MSW;
+   /** Uncorrected Rx RRC CW Count, LSW */
+   DSL_uint16_t GolayErr_LSW;
+   /** Uncorrected Rx RRC CW Count, LSW */
+   DSL_uint16_t GolayErr_MSW;
+   /** Roundtrip Error Count, LSW */
+   DSL_uint16_t RoundtripErr_LSW;
+   /** Roundtrip Error Count, MSW */
+   DSL_uint16_t RoundtripErr_MSW;
 #endif
 } __PACKED__ ;
 
diff --git a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_perf_pmd.h b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_perf_pmd.h
similarity index 94%
rename from src/include/mcat3.1/drv_dsl_cpe_vrx_msg_perf_pmd.h
rename to src/include/mcat3.2/drv_dsl_cpe_vrx_msg_perf_pmd.h
index 1a3a1fa90059c1814cbd4ccd2bda10ab786772aa..923e4f0a4fa735db84ebc7580afb4b7de2ae6e3c 100644
--- a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_perf_pmd.h
+++ b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_perf_pmd.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                            Copyright (c) 2007-2017
-                       Lantiq Beteiligungs-GmbH & Co. KG
+         Copyright 2016 - 2018 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.
@@ -293,6 +295,27 @@ typedef struct CMD_SOS_StatsFE_Get CMD_SOS_StatsFE_Get_t;
 */
 typedef struct ACK_SOS_StatsFE_Get ACK_SOS_StatsFE_Get_t;
 
+/** Message ID for CMD_OHC_StatsGet  */
+#define CMD_OHC_STATSGET  0x410A
+
+/**
+   Requests error counters for the overhead channel. Applicable for cases where
+   the data and overhead channel are in different latency paths: RTX mode or/and
+   ROC used. These are wrap-around counters which are not affected by the
+   TR1-period.
+*/
+typedef struct CMD_OHC_StatsGet  CMD_OHC_StatsGet_t;
+
+/** Message ID for ACK_OHC_StatsGet */
+#define ACK_OHC_STATSGET 0x410A
+
+/**
+   Provides error counters for the LP carrying the overhead channel (EOC, RRC,
+   ROC). Useful only for cases where the data and overhead channel are in
+   separate latency paths: RTX mode or/and ROC used.
+*/
+typedef struct ACK_OHC_StatsGet ACK_OHC_StatsGet_t;
+
 /** Message ID for CMD_LinePerfCountNE_Set */
 #define CMD_LINEPERFCOUNTNE_SET 0x024A
 
@@ -1289,6 +1312,65 @@ struct ACK_SOS_StatsFE_Get
 } __PACKED__ ;
 
 
+/**
+   Requests error counters for the overhead channel. Applicable for cases where
+   the data and overhead channel are in different latency paths: RTX mode or/and
+   ROC used. These are wrap-around counters which are not affected by the
+   TR1-period.
+*/
+struct CMD_OHC_StatsGet 
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+#endif
+} __PACKED__ ;
+
+
+/**
+   Provides error counters for the LP carrying the overhead channel (EOC, RRC,
+   ROC). Useful only for cases where the data and overhead channel are in
+   separate latency paths: RTX mode or/and ROC used.
+*/
+struct ACK_OHC_StatsGet
+{
+#if DSL_BYTE_ORDER == DSL_BIG_ENDIAN
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** Near-End CRC Count LP0, LSW */
+   DSL_uint16_t cntCRC_LSW;
+   /** Near-End CRC Count LP0, MSW */
+   DSL_uint16_t cntCRC_MSW;
+   /** Near-End FEC Count LP0, LSW */
+   DSL_uint16_t cntFEC_LSW;
+   /** Near-End FEC Count LP0, MSW */
+   DSL_uint16_t cntFEC_MSW;
+#else
+   /** Index */
+   DSL_uint16_t Index;
+   /** Length */
+   DSL_uint16_t Length;
+   /** Near-End CRC Count LP0, LSW */
+   DSL_uint16_t cntCRC_LSW;
+   /** Near-End CRC Count LP0, MSW */
+   DSL_uint16_t cntCRC_MSW;
+   /** Near-End FEC Count LP0, LSW */
+   DSL_uint16_t cntFEC_LSW;
+   /** Near-End FEC Count LP0, MSW */
+   DSL_uint16_t cntFEC_MSW;
+#endif
+} __PACKED__ ;
+
+
 /**
    Writes near-end line performance counter values (total wrap-around)(Section
    7.2.1.1 of G.997.1).
diff --git a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_tc_counters.h b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_tc_counters.h
similarity index 97%
rename from src/include/mcat3.1/drv_dsl_cpe_vrx_msg_tc_counters.h
rename to src/include/mcat3.2/drv_dsl_cpe_vrx_msg_tc_counters.h
index d94b77b199691dddb6264fc862985902f950a608..a6141e019509e68afde6e06dfd54be3dd8d1b899 100644
--- a/src/include/mcat3.1/drv_dsl_cpe_vrx_msg_tc_counters.h
+++ b/src/include/mcat3.2/drv_dsl_cpe_vrx_msg_tc_counters.h
@@ -1,7 +1,9 @@
 /******************************************************************************
 
-                            Copyright (c) 2007-2017
-                       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.
@@ -55,6 +57,7 @@
 #define ACK_VersionInfoGet_R3 10
 #define ACK_VersionInfoGet_R4 11
 #define ACK_VersionInfoGet_R5 12
+#define ACK_VersionInfoGet_R6 13
 #define ACK_VersionInfoGet_RELEASE 0
 #define ACK_VersionInfoGet_PRERELEASE 1
 #define ACK_VersionInfoGet_DEVELOP 3
@@ -298,7 +301,7 @@ typedef struct ACK_ATM_BC0_TxStatsNE_Get ACK_ATM_BC0_TxStatsNE_Get_t;
 
 /**
    Writes the transmit data-path counters for BC0 of an ATM-TC link.For "Why
-   writing performance counters" see Page 669.
+   writing performance counters" see Page 690.
 */
 typedef struct CMD_ATM_BC0_TxStatsNE_Set CMD_ATM_BC0_TxStatsNE_Set_t;
 
@@ -323,7 +326,7 @@ typedef struct CMD_VersionInfoGet CMD_VersionInfoGet_t;
 
 /**
    Provides version information about hardware and firmware. The FW version
-   numbering scheme has a long and a short form (Table 368).
+   numbering scheme has a long and a short form (Table 378).
 */
 typedef struct ACK_VersionInfoGet ACK_VersionInfoGet_t;
 
@@ -1399,7 +1402,7 @@ struct ACK_ATM_BC0_TxStatsNE_Get
 
 /**
    Writes the transmit data-path counters for BC0 of an ATM-TC link.For "Why
-   writing performance counters" see Page 669.
+   writing performance counters" see Page 690.
 */
 struct CMD_ATM_BC0_TxStatsNE_Set
 {
@@ -1473,7 +1476,7 @@ struct CMD_VersionInfoGet
 
 /**
    Provides version information about hardware and firmware. The FW version
-   numbering scheme has a long and a short form (Table 368).
+   numbering scheme has a long and a short form (Table 378).
 */
 struct ACK_VersionInfoGet
 {
@@ -1700,8 +1703,12 @@ struct ACK_ADSL_FeatureMapGet
    /** Feature Map Length */
    DSL_uint16_t FeatMapLen;
    /** Reserved */
-   DSL_uint16_t Res0 : 3;
-   /** Feature-Bit12  */
+   DSL_uint16_t Res0 : 1;
+   /** Feature-Bit14 of Word 0: OHC Error Counters */
+   DSL_uint16_t W0F14 : 1;
+   /** Reserved */
+   DSL_uint16_t Res1 : 1;
+   /** Feature-Bit12 of Word 0: Power Down */
    DSL_uint16_t W0F12 : 1;
    /** Feature-Bit11 of Word 0: NTR */
    DSL_uint16_t W0F11 : 1;
@@ -1714,7 +1721,7 @@ struct ACK_ADSL_FeatureMapGet
    /** Feature-Bit7 of Word 0: Short Init */
    DSL_uint16_t W0F07 : 1;
    /** Reserved */
-   DSL_uint16_t Res1 : 1;
+   DSL_uint16_t Res2 : 1;
    /** Feature-Bit5 of Word 0:  G.INP Retransmission DS + SRA */
    DSL_uint16_t W0F05 : 1;
    /** Feature-Bit4 of Word 0:  G.INP Retransmission DS + Bonding (EFM) */
@@ -1722,13 +1729,13 @@ struct ACK_ADSL_FeatureMapGet
    /** Feature-Bit3 of Word 0:PTM Off-chip Bonding BACP */
    DSL_uint16_t W0F03 : 1;
    /** Reserved */
-   DSL_uint16_t Res2 : 2;
+   DSL_uint16_t Res3 : 2;
    /** Feature-Bit0 of Word 0: Annex I */
    DSL_uint16_t W0F00 : 1;
    /** Reserved */
-   DSL_uint16_t Res3 : 16;
-   /** Reserved  */
    DSL_uint16_t Res4 : 16;
+   /** Reserved  */
+   DSL_uint16_t Res5 : 16;
 #else
    /** Index */
    DSL_uint16_t Index;
@@ -1739,7 +1746,7 @@ struct ACK_ADSL_FeatureMapGet
    /** Feature-Bit0 of Word 0: Annex I */
    DSL_uint16_t W0F00 : 1;
    /** Reserved */
-   DSL_uint16_t Res2 : 2;
+   DSL_uint16_t Res3 : 2;
    /** Feature-Bit3 of Word 0:PTM Off-chip Bonding BACP */
    DSL_uint16_t W0F03 : 1;
    /** Feature-Bit4 of Word 0:  G.INP Retransmission DS + Bonding (EFM) */
@@ -1747,7 +1754,7 @@ struct ACK_ADSL_FeatureMapGet
    /** Feature-Bit5 of Word 0:  G.INP Retransmission DS + SRA */
    DSL_uint16_t W0F05 : 1;
    /** Reserved */
-   DSL_uint16_t Res1 : 1;
+   DSL_uint16_t Res2 : 1;
    /** Feature-Bit7 of Word 0: Short Init */
    DSL_uint16_t W0F07 : 1;
    /** Feature-Bit8 of Word 0:  Counter Inhibiting */
@@ -1758,14 +1765,18 @@ struct ACK_ADSL_FeatureMapGet
    DSL_uint16_t W0F10 : 1;
    /** Feature-Bit11 of Word 0: NTR */
    DSL_uint16_t W0F11 : 1;
-   /** Feature-Bit12  */
+   /** Feature-Bit12 of Word 0: Power Down */
    DSL_uint16_t W0F12 : 1;
    /** Reserved */
-   DSL_uint16_t Res0 : 3;
+   DSL_uint16_t Res1 : 1;
+   /** Feature-Bit14 of Word 0: OHC Error Counters */
+   DSL_uint16_t W0F14 : 1;
+   /** Reserved */
+   DSL_uint16_t Res0 : 1;
    /** Reserved */
-   DSL_uint16_t Res3 : 16;
-   /** Reserved  */
    DSL_uint16_t Res4 : 16;
+   /** Reserved  */
+   DSL_uint16_t Res5 : 16;
 #endif
 } __PACKED__ ;
 
@@ -1803,20 +1814,24 @@ struct ACK_VDSL_FeatureMapGet
    DSL_uint16_t Length;
    /** Feature Map Length */
    DSL_uint16_t FeatMapLen;
-   /** Reserved */
-   DSL_uint16_t Res0 : 3;
-   /** Feature-Bit12  */
+   /** Feature-Bit15 of Word 0: ROC in RTX Mode */
+   DSL_uint16_t W0F15 : 1;
+   /** Feature-Bit14 of Word 0: OHC Error Counters */
+   DSL_uint16_t W0F14 : 1;
+   /** Feature-Bit13 of Word 0: SOS in RTX Mode */
+   DSL_uint16_t W0F13 : 1;
+   /** Feature-Bit12 of Word 0: Power Down */
    DSL_uint16_t W0F12 : 1;
    /** Feature-Bit11 of Word 0: NTR */
    DSL_uint16_t W0F11 : 1;
    /** Reserved */
-   DSL_uint16_t Res1 : 1;
+   DSL_uint16_t Res0 : 1;
    /** Feature-Bit9 of Word 0: Pre-emption & Short Packets  */
    DSL_uint16_t W0F09 : 1;
    /** Feature-Bit8 of Word 0: Erasure Decoding /FORCEINP */
    DSL_uint16_t W0F08 : 1;
    /** Reserved */
-   DSL_uint16_t Res2 : 1;
+   DSL_uint16_t Res1 : 1;
    /** Feature-Bit6 of Word 0: Intra DTU Interleaving US */
    DSL_uint16_t W0F06 : 1;
    /** Feature-Bit5 of Word 0: Intra DTU Interleaving DS */
@@ -1828,11 +1843,11 @@ struct ACK_VDSL_FeatureMapGet
    /** Feature-Bit2 of Word 2: Microfilter Detection and Hybrid Data */
    DSL_uint16_t W2F02 : 1;
    /** Reserved */
-   DSL_uint16_t Res3 : 2;
+   DSL_uint16_t Res2 : 2;
    /** Reserved */
-   DSL_uint16_t Res4 : 16;
+   DSL_uint16_t Res3 : 16;
    /** Reserved  */
-   DSL_uint16_t Res5 : 16;
+   DSL_uint16_t Res4 : 16;
 #else
    /** Index */
    DSL_uint16_t Index;
@@ -1841,7 +1856,7 @@ struct ACK_VDSL_FeatureMapGet
    /** Feature Map Length */
    DSL_uint16_t FeatMapLen;
    /** Reserved */
-   DSL_uint16_t Res3 : 2;
+   DSL_uint16_t Res2 : 2;
    /** Feature-Bit2 of Word 2: Microfilter Detection and Hybrid Data */
    DSL_uint16_t W2F02 : 1;
    /** Feature-Bit3 of Word 0: PTM Off-chip Bonding BACP */
@@ -1853,23 +1868,27 @@ struct ACK_VDSL_FeatureMapGet
    /** Feature-Bit6 of Word 0: Intra DTU Interleaving US */
    DSL_uint16_t W0F06 : 1;
    /** Reserved */
-   DSL_uint16_t Res2 : 1;
+   DSL_uint16_t Res1 : 1;
    /** Feature-Bit8 of Word 0: Erasure Decoding /FORCEINP */
    DSL_uint16_t W0F08 : 1;
    /** Feature-Bit9 of Word 0: Pre-emption & Short Packets  */
    DSL_uint16_t W0F09 : 1;
    /** Reserved */
-   DSL_uint16_t Res1 : 1;
+   DSL_uint16_t Res0 : 1;
    /** Feature-Bit11 of Word 0: NTR */
    DSL_uint16_t W0F11 : 1;
-   /** Feature-Bit12  */
+   /** Feature-Bit12 of Word 0: Power Down */
    DSL_uint16_t W0F12 : 1;
+   /** Feature-Bit13 of Word 0: SOS in RTX Mode */
+   DSL_uint16_t W0F13 : 1;
+   /** Feature-Bit14 of Word 0: OHC Error Counters */
+   DSL_uint16_t W0F14 : 1;
+   /** Feature-Bit15 of Word 0: ROC in RTX Mode */
+   DSL_uint16_t W0F15 : 1;
    /** Reserved */
-   DSL_uint16_t Res0 : 3;
-   /** Reserved */
-   DSL_uint16_t Res4 : 16;
+   DSL_uint16_t Res3 : 16;
    /** Reserved  */
-   DSL_uint16_t Res5 : 16;
+   DSL_uint16_t Res4 : 16;
 #endif
 } __PACKED__ ;
 
diff --git a/src/pm/drv_dsl_cpe_api_pm.c b/src/pm/drv_dsl_cpe_api_pm.c
index 62a395c01adfc76ddcacd3b7b5abdcf660d80440..3087d98c9f5247fdcdbb83f3cef0b700e0674409 100644
--- a/src/pm/drv_dsl_cpe_api_pm.c
+++ b/src/pm/drv_dsl_cpe_api_pm.c
@@ -11,6 +11,9 @@
 #define DSL_INTERN
 
 #include "drv_dsl_cpe_api.h"
+#ifdef __LINUX__
+#include <linux/capability.h>
+#endif /* __LINUX__ */
 
 #if defined(INCLUDE_DSL_PM)
 
@@ -36,6 +39,14 @@ DSL_Error_t DSL_DRV_PM_ConfigSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pConfig);
    DSL_CHECK_ERR_CODE();
 
@@ -124,6 +135,14 @@ DSL_Error_t DSL_DRV_PM_ConfigGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pConfig);
    DSL_CHECK_ERR_CODE();
 
@@ -701,6 +720,14 @@ DSL_Error_t DSL_DRV_PM_Reset(
    DSL_PM_EpType_t nEp2Reset[DSL_PM_COUNTER_LAST];
    DSL_uint8_t nEpCount = 0, nEpIdx = 0;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pResetType);
    DSL_CHECK_ERR_CODE();
 
@@ -803,6 +830,14 @@ DSL_Error_t DSL_DRV_PM_15MinElapsedExtTrigger(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_boolean_t b15min = DSL_FALSE, b1day = DSL_FALSE;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pTrigger);
    DSL_CHECK_ERR_CODE();
 
@@ -891,6 +926,14 @@ DSL_Error_t DSL_DRV_PM_ElapsedTimeReset(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pReset);
    DSL_CHECK_ERR_CODE();
 
@@ -952,6 +995,14 @@ DSL_Error_t DSL_DRV_PM_SyncModeSet(
    DSL_PM_SyncModeType_t mode;
    DSL_DRV_TimeVal_t currTime;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pMode);
    DSL_CHECK_ERR_CODE();
 
@@ -1032,6 +1083,14 @@ DSL_Error_t DSL_DRV_PM_SyncModeGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pMode);
    DSL_CHECK_ERR_CODE();
 
@@ -1078,6 +1137,14 @@ DSL_Error_t DSL_DRV_PM_BurninModeSet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pBurninMode);
    DSL_CHECK_ERR_CODE();
 
@@ -1177,6 +1244,14 @@ DSL_Error_t DSL_DRV_PM_ChannelHistoryStats15MinGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -1277,6 +1352,14 @@ DSL_Error_t DSL_DRV_PM_ChannelHistoryStats1DayGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -1376,6 +1459,14 @@ DSL_Error_t DSL_DRV_PM_ChannelCounters15MinGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -1434,6 +1525,14 @@ DSL_Error_t DSL_DRV_PM_ChannelCounters1DayGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -1495,6 +1594,14 @@ DSL_Error_t DSL_DRV_PM_ChannelCountersTotalGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_ChannelData_t *pChCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -1614,6 +1721,14 @@ DSL_Error_t DSL_DRV_PM_ChannelThresholds15MinSet(
    DSL_PM_ChannelData_t *pChCounters, *pThresholds;
    DSL_pmChannelThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -1693,6 +1808,14 @@ DSL_Error_t DSL_DRV_PM_ChannelThresholds1DaySet(
    DSL_PM_ChannelData_t *pChCounters, *pThresholds;
    DSL_pmChannelThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -1772,6 +1895,14 @@ DSL_Error_t DSL_DRV_PM_ChannelThresholds15MinGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_ChannelData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -1843,6 +1974,14 @@ DSL_Error_t DSL_DRV_PM_ChannelThresholds1DayGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_ChannelData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -1923,6 +2062,14 @@ DSL_Error_t DSL_DRV_PM_ChannelCountersShowtimeGet(
    DSL_pmBF_IntervalFailures_t nCurrFailures;
    DSL_PM_ChannelData_t *pChCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -2083,6 +2230,14 @@ DSL_Error_t DSL_DRV_PM_ChannelCountersExtShowtimeGet(
    DSL_pmBF_IntervalFailures_t nCurrFailures;
    DSL_PM_ChannelDataExt_t *pChCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -2247,6 +2402,14 @@ DSL_Error_t DSL_DRV_PM_DataPathHistoryStats15MinGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -2347,6 +2510,14 @@ DSL_Error_t DSL_DRV_PM_DataPathHistoryStats1DayGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -2443,6 +2614,14 @@ DSL_Error_t DSL_DRV_PM_DataPathCounters15MinGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -2489,6 +2668,14 @@ DSL_Error_t DSL_DRV_PM_DataPathCounters1DayGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -2538,6 +2725,14 @@ DSL_Error_t DSL_DRV_PM_DataPathCountersTotalGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_DataPathData_t *pDpCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -2616,6 +2811,14 @@ DSL_Error_t DSL_DRV_PM_DataPathThresholds15MinSet(
    DSL_PM_DataPathData_t *pDpCounters, *pThresholds;
    DSL_pmDataPathThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -2698,6 +2901,14 @@ DSL_Error_t DSL_DRV_PM_DataPathThresholds1DaySet(
    DSL_PM_DataPathData_t *pDpCounters, *pThresholds;
    DSL_pmDataPathThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -2777,6 +2988,14 @@ DSL_Error_t DSL_DRV_PM_DataPathThresholds15MinGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_DataPathData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -2848,6 +3067,14 @@ DSL_Error_t DSL_DRV_PM_DataPathThresholds1DayGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_DataPathData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -2927,6 +3154,14 @@ DSL_Error_t DSL_DRV_PM_DataPathCountersShowtimeGet(
    DSL_pmBF_IntervalFailures_t nCurrFailures;
    DSL_PM_DataPathData_t *pDpCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -3117,6 +3352,14 @@ DSL_Error_t DSL_DRV_PM_DataPathFailureHistoryStats15MinGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -3217,6 +3460,14 @@ DSL_Error_t DSL_DRV_PM_DataPathFailureHistoryStats1DayGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -3313,6 +3564,14 @@ DSL_Error_t DSL_DRV_PM_DataPathFailureCounters15MinGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -3341,6 +3600,14 @@ DSL_Error_t DSL_DRV_PM_DataPathFailureCounters1DayGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -3372,6 +3639,14 @@ DSL_Error_t DSL_DRV_PM_DataPathFailureCountersTotalGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_DataPathFailureData_t *pDpCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -3432,6 +3707,14 @@ DSL_Error_t DSL_DRV_PM_DataPathFailureCountersShowtimeGet(
    DSL_pmBF_IntervalFailures_t nCurrFailures;
    DSL_PM_DataPathFailureData_t *pDpCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -3597,6 +3880,14 @@ DSL_Error_t DSL_DRV_PM_LineSecHistoryStats15MinGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -3697,6 +3988,14 @@ DSL_Error_t DSL_DRV_PM_LineSecHistoryStats1DayGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -3796,6 +4095,14 @@ DSL_Error_t DSL_DRV_PM_LineSecCounters15MinGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -3824,6 +4131,14 @@ DSL_Error_t DSL_DRV_PM_LineSecCounters1DayGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -3857,6 +4172,14 @@ DSL_Error_t DSL_DRV_PM_LineSecThresholds15MinSet(
    DSL_PM_LineSecData_t *pLineSecCounters, *pThresholds;
    DSL_pmLineThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -3936,6 +4259,14 @@ DSL_Error_t DSL_DRV_PM_LineSecThresholds1DaySet(
    DSL_PM_LineSecData_t *pLineSecCounters, *pThresholds;
    DSL_pmLineThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -4013,6 +4344,14 @@ DSL_Error_t DSL_DRV_PM_LineSecThresholds15MinGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_LineSecData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -4081,6 +4420,14 @@ DSL_Error_t DSL_DRV_PM_LineSecThresholds1DayGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_LineSecData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -4153,6 +4500,14 @@ DSL_Error_t DSL_DRV_PM_LineSecCountersTotalGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_LineSecData_t *pLineCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -4218,6 +4573,14 @@ DSL_Error_t DSL_DRV_PM_LineSecCountersShowtimeGet(
    DSL_pmBF_IntervalFailures_t nCurrFailures;
    DSL_PM_LineSecData_t *pLineCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -4385,6 +4748,14 @@ DSL_Error_t DSL_DRV_PM_LineInitHistoryStats15MinGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_uint32_t histFillLevel = 0;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -4432,6 +4803,14 @@ DSL_Error_t DSL_DRV_PM_LineInitHistoryStats1DayGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_uint32_t histFillLevel = 0;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -4479,6 +4858,14 @@ DSL_Error_t DSL_DRV_PM_LineInitCounters15MinGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -4507,6 +4894,14 @@ DSL_Error_t DSL_DRV_PM_LineInitCounters1DayGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -4540,6 +4935,14 @@ DSL_Error_t DSL_DRV_PM_LineInitThresholds15MinSet(
    DSL_PM_LineInitData_t *pLineInitCounters, *pThresholds;
    DSL_pmLineThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -4616,6 +5019,14 @@ DSL_Error_t DSL_DRV_PM_LineInitThresholds1DaySet(
    DSL_PM_LineInitData_t *pLineInitCounters, *pThresholds;
    DSL_pmLineThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -4689,6 +5100,14 @@ DSL_Error_t DSL_DRV_PM_LineInitThresholds15MinGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_LineInitData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -4749,6 +5168,14 @@ DSL_Error_t DSL_DRV_PM_LineInitThresholds1DayGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_LineInitData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -4813,6 +5240,14 @@ DSL_Error_t DSL_DRV_PM_LineInitCountersTotalGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_LineInitData_t *pLinitCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -4860,6 +5295,14 @@ DSL_Error_t DSL_DRV_PM_LineInitCountersShowtimeGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0;
    DSL_PM_LineInitData_t *pLineCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -5006,6 +5449,14 @@ DSL_Error_t DSL_DRV_PM_LineEventShowtimeHistoryStats15MinGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -5106,6 +5557,14 @@ DSL_Error_t DSL_DRV_PM_LineEventShowtimeHistoryStats1DayGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -5203,6 +5662,14 @@ DSL_Error_t DSL_DRV_PM_LineEventShowtimeCounters15MinGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -5231,6 +5698,14 @@ DSL_Error_t DSL_DRV_PM_LineEventShowtimeCounters1DayGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -5263,6 +5738,14 @@ DSL_Error_t DSL_DRV_PM_LineEventShowtimeCountersTotalGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_LineEventShowtimeData_t *pLfCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -5321,6 +5804,14 @@ DSL_Error_t DSL_DRV_PM_LineEventShowtimeCountersShowtimeGet(
    DSL_pmBF_IntervalFailures_t nCurrFailures;
    DSL_PM_LineEventShowtimeData_t *pLfCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -5485,6 +5976,14 @@ DSL_Error_t DSL_DRV_PM_ReTxHistoryStats15MinGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -5585,6 +6084,14 @@ DSL_Error_t DSL_DRV_PM_ReTxHistoryStats1DayGet(
    DSL_uint32_t histFillLevel = 0, histInv = 0, prevInvIntervals = 0;
    DSL_int_t histIdx = -1;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pStats);
    DSL_CHECK_ERR_CODE();
 
@@ -5684,6 +6191,14 @@ DSL_Error_t DSL_DRV_PM_ReTxCounters15MinGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -5712,6 +6227,14 @@ DSL_Error_t DSL_DRV_PM_ReTxCounters1DayGet(
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_CTX_POINTER(pContext);
    DSL_CHECK_ERR_CODE();
 
@@ -5743,6 +6266,14 @@ DSL_Error_t DSL_DRV_PM_ReTxCountersTotalGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_ReTxData_t *pReTxCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
@@ -5800,6 +6331,14 @@ DSL_Error_t DSL_DRV_PM_ReTxThresholds15MinSet(
    DSL_PM_ReTxData_t *pReTxCounters, *pThresholds;
    DSL_pmReTxThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -5879,6 +6418,14 @@ DSL_Error_t DSL_DRV_PM_ReTxThresholds1DaySet(
    DSL_PM_ReTxData_t *pReTxCounters, *pThresholds;
    DSL_pmReTxThresholdCrossingData_t *pInd ;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -5955,6 +6502,14 @@ DSL_Error_t DSL_DRV_PM_ReTxThresholds15MinGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_ReTxData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -6023,6 +6578,14 @@ DSL_Error_t DSL_DRV_PM_ReTxThresholds1DayGet(
    DSL_Error_t nErrCode = DSL_SUCCESS;
    DSL_PM_ReTxData_t *pThresholds;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pThreshs);
    DSL_CHECK_ERR_CODE();
 
@@ -6099,6 +6662,14 @@ DSL_Error_t DSL_DRV_PM_ReTxCountersShowtimeGet(
    DSL_pmBF_IntervalFailures_t nCurrFailures;
    DSL_PM_ReTxData_t *pReTxCounters;
 
+#ifdef __LINUX__
+   if (!capable(CAP_NET_ADMIN))
+   {
+      printk("Permission denied");
+      return -EPERM;
+   }
+#endif /* __LINUX__ */
+
    DSL_CHECK_POINTER(pContext, pCounters);
    DSL_CHECK_ERR_CODE();
 
diff --git a/src/pm/drv_dsl_cpe_api_pm_vrx.c b/src/pm/drv_dsl_cpe_api_pm_vrx.c
index fac527b101c5356499e9cc2185a3387986797c6c..26fd52632af30d5252d55509bc8b0aa48de529e3 100644
--- a/src/pm/drv_dsl_cpe_api_pm_vrx.c
+++ b/src/pm/drv_dsl_cpe_api_pm_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.
@@ -1265,11 +1267,8 @@ DSL_Error_t DSL_DRV_PM_DEV_LineEventShowtimeCountersGet(
    DSL_PM_LineEventShowtimeData_t *pCounters)
 {
    DSL_Error_t nErrCode = DSL_SUCCESS;
-#if 0
-   /* VRx SOS counter not supported by the FW yet, set to 0*/
    CMD_SOS_StatsNE_Get_t sCmd;
    ACK_SOS_StatsNE_Get_t sAck;
-#endif
 
    DSL_DEBUG( DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_DRV_PM_DEV_LineEventShowtimeCountersGet"
@@ -1297,7 +1296,6 @@ DSL_Error_t DSL_DRV_PM_DEV_LineEventShowtimeCountersGet(
 
    DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);
 
-#if 0
    memset(&sCmd, 0x0, sizeof(CMD_SOS_StatsNE_Get_t));
    memset(&sAck, 0x0, sizeof(ACK_SOS_StatsNE_Get_t));
 
@@ -1323,10 +1321,6 @@ DSL_Error_t DSL_DRV_PM_DEV_LineEventShowtimeCountersGet(
 
    pCounters->nSosSuccess = (((DSL_uint32_t)sAck.cntSOS_SUC_MSW) << 16) |
                              ((DSL_uint32_t)sAck.cntSOS_SUC_LSW);
-#else
-   /* VRx SOS counter not supported by the FW yet, set to 0*/
-   pCounters->nSosSuccess = 0;
-#endif
 
    DSL_DEBUG( DSL_DBG_MSG,
       (pContext, SYS_DBG_MSG"DSL[%02d]: OUT - DSL_DRV_PM_DEV_LineEventShowtimeCountersGet (retCode=%d)"